比赛 20120420 评测结果 AAAWWWWAWW
题目名称 狙击兵 最终得分 40
用户昵称 TBK 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-20 11:02:34
显示代码纯文本
#include <iostream> 
#include <cmath> 
#include <cstring> 
#include <string> 
#include <cstdio> 
#include <cstdlib> 
#include <iomanip> 
#include <set> 
#include <algorithm> 
#define MAXN 0x7fffffff 
using namespace std; 
int a[501][501],b,c,d,l,m=0,n,s,r[501],k[501],i,j,p,q,u,v; 
bool bo[501],boo; 
void DFS(int x) 
{ 
    int y; 
    if (boo==false) return; 
    if (x==b) 
    { 
        n=MAXN; 
        for (y=0;y<m-1;y++) n=n<a[r[y]][r[y+1]]?n:a[r[y]][r[y+1]]; 
        s+=n; 
        for (y=0;y<m-1;y++) 
        { 
            a[r[y]][r[y+1]]-=n; 
            a[r[y+1]][r[y]]+=n; 
        } 
        boo=false; 
        return; 
    } 
    for (y=0;y<=b;y++) 
    { 
        if ((a[x][y]!=0)&&(bo[y]==false)) 
        { 
            bo[y]=true; 
            r[m]=y; 
            m++; 
            DFS(y); 
            m--; 
        } 
    } 
} 
int main(void) 
{    
    freopen("snipers.in","r",stdin); 
    freopen("snipers.out","w",stdout); 
    scanf("%d",&i); 
    for (j=0;j<i;j++)
	{
		scanf("%d%d",&b,&q);
		for (p=1;p<b;p++) scanf("%d",&k[p]);
		k[0]=MAXN/2;
		k[b]=MAXN/2;
		for (p=0;p<q;p++)
		{
			scanf("%d%d",&u,&v);
			a[u][v]=k[v];
			a[v][u]=k[u];
		}
		while (boo==false) 
		{ 
			boo=true; 
			for (c=0;c<=b;c++) bo[c]=false; 
			m=1; 
			r[0]=0; 
			bo[0]=true; 
			DFS(0); 
		} 
		printf("%d\n",s); 
	}
    fclose(stdin); 
    fclose(stdout); 
    return 0; 
}