Drainage Ditches(HD1532)
原体链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532
代码:
#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
int min(int a,int b)
{
return a<b?a:b;
}
int getMax(int c[201][201],int nodenum)
{
int flow[201][201],max=0;//记录每条路的实际运输量
int a[201],pre[201];//min记录到达此点的最小运输量,pre记录此点的先趋
memset(flow,0,sizeof(flow));
queue<int> q;
while(1)
{
memset(a,0,sizeof(a));
a[1]=100000001;
q.push(1);
//while循环找一条路中的最小运输量
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=1;v<=nodenum;v++)
{
if(!a[v]&&c[u][v]>flow[u][v])//如果该点没有被标记,并且该条路还可以增流
{
q.push(v);
pre[v]=u;
a[v]=min(a[u],c[u][v]-flow[u][v]);
}
}
}
if(a[nodenum]==0)
break;
for(int u=nodenum;u!=1;u=pre[u])
{
flow[pre[u]][u]+=a[nodenum];
flow[u][pre[u]]-=a[nodenum];
}
max+=a[nodenum];
}
return max;
}
int main()
{
int N,M,can[201][201],a,b,c,max;
while(cin>>N>>M)
{
memset(can,0,sizeof(can));
for(int i=1;i<=N;i++)
{
cin>>a>>b>>c;
can[a][b]+=c;
}
max=getMax(can,M);
cout<<max<<endl;
}
}

浙公网安备 33010602011771号