比赛 20120704 评测结果 AAAAAAATTTT
题目名称 子集 最终得分 63
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-04 10:36:09
显示代码纯文本
#include<stdio.h>
#include<vector>
#define max(a,b) a>b?a:b

using namespace std;

int n,m,tmp,ans,a[10001],flag[10001];

vector <int> v[10001];

void dfs(int k)
{
	if(k==n)
	{
		ans=max(ans,tmp);
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(!flag[i])
		{
			flag[i]++;k++;tmp+=a[i];
			for(int j=0;j<v[i].size();j++)
			{
				if(!flag[v[i][j]])
				{
					k++;
				}
				flag[v[i][j]]++;
			}
			dfs(k);
			for(int j=0;j<v[i].size();j++)
			{
				if(flag[v[i][j]]==1)
				{
					k--;
				}
				flag[v[i][j]]--;
			}
			flag[i]--;k--;tmp-=a[i];
		}
	}
}

int main()
{
	freopen("subseta.in","r",stdin);
	freopen("subseta.out","w",stdout);
	int i,j,x,y;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(0);
	printf("%d\n",ans);
	return 0;
}