比赛 聪明的工作员 评测结果 WWWEWWWEWWWW
题目名称 聪明的推销员 最终得分 0
用户昵称 皓芷 运行时间 0.169 s
代码语言 C++ 内存使用 0.41 MiB
提交时间 2017-03-21 19:39:24
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int n,p,g,per[3010]={0},t[3010],r,a,b;
vector<int>fa[3010];
vector<int>son[3010];
int is_huan(int i,int *zg)
{
	int a=20010;
	for(int j=0;j<son[i].size();j++)
	if(zg[son[i][j]]==0)
	{
		zg[son[i][j]]=1;
		a=min(is_huan(son[i][j],zg),t[i]);
	}
	if(zg[i]==1)
	{
		return a;
	}
}
void findson(int i,int *zg)
{
	if(!son[i].empty())
	  for(int j=0;1<son[i].size();j++)
	  if(zg[son[i][j]]==0)
	  {
	  	findson(son[i][j],zg);
	  	zg[son[i][j]]=1;
	  }
}
int ifyes()
{
	int ans=0,zg[3010]={0};
	for(int i=1;i<=n;i++)
	{
		if(fa[i].empty())
		{
			ans+=t[i];
			zg[i]=1;
			findson(i,zg);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(zg[i]==0)
		{
			ans+=is_huan(i,zg);
		}
	}
	return ans;
}
int findunper(int i,int a)
{
	for(int j=0;j<son[i].size();j++)
	if(!per[son[i][j]])
	{
		a=min(son[i][j],i);
		a=findunper(son[i][j],a);
	}
	return a;
}
void ifno()
{
	int k=1,ans=3010;
	for(int i=1;i<=n;i++)
	{
		if(fa[i].empty()&&per[i]==0)
		{
			ans=min(ans,findunper(i,3010));
			k=0;
		}
	}
	if(k==0)
	{
		printf("NO\n%d",ans);
		return;
	}
	printf("YES\n%d",ifyes());
}
int main()
{
	freopen("salenet.in","r",stdin);
	freopen("salenet.out","w",stdout);
	scanf("%d%d",&n,&p);
	for(int i=0;i<=n;i++)
	  t[i]=20010;
	for(int i=1;i<=p;i++)
	{
		scanf("%d",&g);
		per[g]=1;
		scanf("%d",&t[g]);
		printf("%d\n",t[g]);
	}
	scanf("%d",&r);
	for(int i=1;i<=r;i++)
	{
		scanf("%d%d",&a,&b);
		fa[b].push_back(a);
		son[a].push_back(b);
	}
	ifno();
	return 0;
}