比赛 20120420 评测结果 AAAWWWWWEW
题目名称 狙击兵 最终得分 30
用户昵称 Makazeu 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-20 11:18:03
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define MAXN 51
using namespace std;
const int INF=100000000;
int TS,N,M;
int Num[MAXN];
int F[MAXN][MAXN];

void init()
{
	scanf("%d %d\n",&N,&M);  int x,y; Num[0]=Num[N]=INF;
	for(int i=1;i<=N-1;i++) scanf("%d",&Num[i]);
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d\n",&x,&y);
		F[x][y]=Num[y];
	}
}

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

int flag[MAXN],Pnt[MAXN];
void MF_FF() /*MaxFlow Ford-Fulkerson*/
{
    int Ans=0; int S=0,T=N;
    while(1) 
    {
		queue<int> Q;
        for(int i=0;i<=N;i++) flag[i]=0,Pnt[i]=0;
        int u,v;
        flag[S]=1;
        Q.push(S);
        while(!Q.empty())
        {
            u=Q.front();
            Q.pop();
            if(u==T) break;
            for(v=0;v<=N;v++)
            {
                if(F[u][v]>0 && !flag[v])
                {
                    Pnt[v]=u;
                    flag[v]=1;
                    Q.push(v);
                }
            }
        }
        if(!flag[T]) break;
        int MinFlow=INF;
        for(u=T;u!=S;u=Pnt[u])
            MinFlow=Min(MinFlow,F[Pnt[u]][u]);
        Ans+=MinFlow;
        for(u=T;u!=S;u=Pnt[u])
            F[Pnt[u]][u]-=MinFlow,F[u][Pnt[u]]+=MinFlow;
    }
    printf("%d\n",Ans);
}

int main()
{
	freopen("snipers.in","r",stdin);
	freopen("snipers.out","w",stdout);
	scanf("%d\n",&TS);
	for(int i=1;i<=TS;i++)
	{
		init();
		MF_FF();
	}
	return 0;
}