2013 编程之美 初赛第二场 管道系统小数据

来源:互联网 发布:python 去除重复元素 编辑:程序博客网 时间:2024/05/20 09:05
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define MAX 205const int INF=999999999;using namespace std;int flow[MAX][MAX],cap[MAX][MAX],a[MAX],f[MAX],n;//a[i]表示流入i点的流量inline int min(int a,int b) {return a<b?a:b;}int bfs(int s,int t){    queue<int> q;    memset(flow,0,sizeof(flow));    int ans=0;    while(1)    {        memset(a,0,sizeof(a));        a[s]=INF;        q.push(s);        while(!q.empty())        {            int u=q.front();q.pop();            for(int i=1;i<=n;i++)            if(!a[i]&&flow[u][i]<cap[u][i])            {                f[i]=u;q.push(i);                a[i]=min(a[u],cap[u][i]-flow[u][i]);            }        }        if(a[t]==0) break;        for(int u=t;u!=s;u=f[u])        {            flow[f[u]][u]+=a[t];            flow[u][f[u]]-=a[t];        }        ans+=a[t];        //cout<<ans<<endl;    }    return ans;}int main(){    //freopen("data.txt","r",stdin);    int T,count[MAX],k=1;    scanf("%d",&T);    while(T--)    {        int m,nx,ny,t;        scanf("%d %d",&n,&m);        memset(cap,0,sizeof(cap));        for(int i=1;i<=m;i++)        {            cin>>nx>>ny>>t;            cap[nx][ny]+=t;            cap[ny][nx]+=t;            count[i]=bfs(1,n);        }        int max=0;        printf("Case #%d:\n",k++);        for(int i=1;i<=m;i++)        {            if(count[i]>max)            {                printf("%d %d\n",i,count[i]-max);                max=count[i];            }        }    }    return 0;}