记录编号 62751 评测结果 AAAAAAAAAAAA
题目名称 聪明的推销员 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.005 s
提交时间 2013-07-09 13:26:16 内存使用 11.79 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cmath>
using namespace std;
const int SIZEN=3001;
vector<int> c[SIZEN];
vector<int> cust;//顾客
bool cp[SIZEN]={0};//每个人是否可被说服
int tc[SIZEN]={0};//说服每个人需要的时间
bool con[SIZEN][SIZEN]={0};//连通性
int n,m,p;
bool visited[SIZEN]={0};
bool visit[SIZEN]={0};
int ans=0;
void slove(void){
	int i,j,x,u;
	for(i=1;i<=n;i++){
		if(!visited[i]){
			printf("NO\n%d\n",i);
			return;
		}
	}
	printf("YES\n");
	bool col[SIZEN]={0};
	for(i=1;i<=n;i++) col[i]=true;
	for(i=0;i<cust.size();i++){
		x=cust[i];
		for(j=i+1;j<cust.size();j++){
			u=cust[j];
			if(con[u][x]){
				col[x]=false;
				break;
			}
		}
		if(!col[x]) ans-=tc[x];//不选
		else{
			for(j=1;j<=n;j++){
				if(con[x][j]) col[j]=false;
			}
		}
	}
	printf("%d\n",ans);
}
bool cmp(int a,int b){
	return tc[a]>tc[b];
}
void DFS(int x,int grand){
	if(visit[x]) return;
	visited[x]=true;
	con[grand][x]=true;
	visit[x]=true;
	int i,u;
	for(i=0;i<c[x].size();i++){
		u=c[x][i];
		DFS(u,grand);
	}
}
void travel(void){
	int i;
	for(i=1;i<=n;i++){
		if(cp[i]){
			memset(visit,0,sizeof(visit));
			DFS(i,i);
		}
	}
}
void read(void){
	memset(tc,15,sizeof(tc));
	scanf("%d%d",&n,&p);
	int i,x;
	for(i=1;i<=p;i++){
		scanf("%d",&x);
		cp[x]=true;
		cust.push_back(x);
		scanf("%d",&tc[x]);
		ans+=tc[x];
	}
	scanf("%d",&m);
	int a,b;
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		c[a].push_back(b);
	}
}
int main(){
	freopen("salenet.in","r",stdin);
	freopen("salenet.out","w",stdout);
	read();
	travel();
	sort(cust.begin(),cust.end(),cmp);
	//之后cust中按说服时间降序
	slove();
	return 0;
}