#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define inf 100000000
int ans=0;
int queue[1000]={0};
int re[1000]={0}; //表示到i点的最大流
int pa[1000]={0}; //前驱结点
int front,rear;
int flow[210][210]={{0}};
int cap[210][210]={{0}};
void getans(int flow[][210],int cap[][210],int t) //BFS求最大流量
{
int u,i;
while(1)
{
front=rear=0;
memset(re,0,sizeof(re));
re[1]=inf;
queue[rear++]=1;
while(front<rear)
{
u=queue[front++];
for(i=1;i<=t;i++)
{
if(!re[i]&&cap[u][i]>flow[u][i])
{
pa[i]=u;
re[i]=re[u]<(cap[u][i]-flow[u][i])?re[u]:(cap[u][i]-flow[u][i]);
queue[rear++]=i;
}
}
}
if(re[t]==0) //表示到t点没有流量了,结束
break;
for(i=t;i!=1;i=pa[i])
{
flow[pa[i]][i]+=re[t];
flow[i][pa[i]]-=re[t];
}
ans+=re[t];
}
}
int main()
{
FILE *fin=fopen("ditch.in","r");
FILE *fout=fopen("ditch.out","w");
int m,n;
int x,y,t;
int i ;
fscanf(fin,"%d %d ",&n,&m);
for(i=0;i<n;i++)
{
fscanf(fin,"%d %d %d",&x,&y,&t);
cap[x][y]+=t; //可能不只一条通道
}
getans(flow,cap,m);
fprintf(fout,"%d\n",ans);
return 0;
}
USACO4.2.1/ditch
最新推荐文章于 2017-02-18 16:38:46 发布