比赛 20120709 评测结果 WAEEWTTTWTWW
题目名称 聪明的推销员 最终得分 8
用户昵称 Czb。 运行时间 4.718 s
代码语言 C++ 内存使用 0.41 MiB
提交时间 2012-07-09 11:54:29
显示代码纯文本
#include<stdio.h>
#include<vector>
#include<string.h>
#define min(a,b) a<b?a:b

using namespace std;

int n,k,m,ans,t1,t2,a[3001],b[3001];

int f[3001];

bool flag[3001],bo[3001];

vector <int> v[3001],u[3001];

void dfs(int t,int tt)
{
	for(int i=0;i<v[t].size();i++)
	{
		if(!flag[v[t][i]])
		{
			bo[v[t][i]]=true;
			flag[v[t][i]]=true;
			u[tt].push_back(v[t][i]);
			dfs(v[t][i],tt);
		}
	}
}

void dfs1(int t)
{
	if(t==n)
	{
		ans=min(ans,t1);
	}
	for(int i=1;i<=k;i++)
	{
		if(!f[a[i]])
		{
			t1+=b[i];
			t2++;
			for(int j=0;j<u[a[i]].size();j++)
			{
				if(!f[u[a[i]][j]])
				{
					t2++;
					f[u[a[i]][j]]++;
				}
			}
			dfs1(t+1);
			t1-=b[i];
			t2--;
			for(int j=0;j<u[a[i]].size();j++)
			{
				f[u[a[i]][j]]--;
				if(!f[u[a[i]][j]])
				{
					t2--;
				}
			}
		}
	}
}

int main()
{
	freopen("salenet.in","r",stdin);
	freopen("salenet.out","w",stdout);
	int i,j,x,y;
	scanf("%d%d",&n,&k);
	for(i=1;i<=k;i++)
	{
		scanf("%d%d",&a[i],&b[i]);
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
	}
	for(i=1;i<=k;i++)
	{
		memset(flag,0,sizeof(flag));
		u[a[i]].push_back(a[i]);
		flag[a[i]]=true;
		bo[a[i]]=true;
		dfs(a[i],a[i]);
	}
	for(i=1;i<=n;i++)
	{
		if(!bo[i])
		{
			printf("No\n%d\n",i);
			return 0;
		}
	}
	ans=0x7FFFFFFF;
	dfs1(1);
	printf("YES\n%d\n",ans);
	return 0;
}