比赛 20120420 评测结果 AAWWWWWWWW
题目名称 狙击兵 最终得分 20
用户昵称 201101 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-20 10:50:23
显示代码纯文本
/*
UID:cheepok
PID:snipers
*/

#include<stdio.h>
#include<string.h>

int Q,n,m,ans,Min,a[100],last[100],f[100][100];

bool flag[100];

int min(int a,int b)
{
	return a<b?a:b;
}

void dfs(int k)
{
	if(k==n)
	{
		Min=1000;
		flag[66]=true;
		for(int i=n;i;i=last[i])
		{
			Min=min(Min,f[last[i]][i]);
		}
		for(int i=n;i;i=last[i])
		{
			f[last[i]][i]-=Min;
			f[i][last[i]]+=Min;
		}
		ans+=Min;
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(f[k][i]&&flag[i])
		{
			flag[i]=false;
			last[i]=k;
			dfs(i);
			if(flag[n])
			{
				return;
			}
		}
	}
}

int main()
{
	freopen("snipers.in","r",stdin);
	freopen("snipers.out","w",stdout);
	int i,j,x,y;
	scanf("%d",&Q);
	while(Q--)
	{
		scanf("%d%d",&n,&m);
		for(i=1;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		a[0]=a[n]=1000;ans=0;
		memset(f,0,sizeof(f));
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			f[x][y]=min(a[x],a[y]);
			f[y][x]=f[x][y];
		}
		flag[66]=true;
		while(flag[66])
		{
			memset(flag,1,sizeof(flag));
			memset(last,0,sizeof(last));
			flag[0]=false;flag[66]=false;
			dfs(0);
		}
		printf("%d\n",ans);
	}
	return 0;
}