Description
Input
Output
Sample Input
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Output
50
红果果的网络流,Edmonds-Karp 最短增广路算法。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
#define maxe 210
int n,m,G[maxe][maxe],PreSta[maxe];
bool visit[maxe];
void init()
{
int temp,from,to;
memset(G,0,sizeof(G));
for(int i=0;i<n;i++)
{
scanf("%d %d %d",&from,&to,&temp);
G[from][to]+=temp;
}
return ;
}
int Augment()
{
queue<int> Q;
memset(visit,0,sizeof(visit));
memset(PreSta,0,sizeof(PreSta));
Q.push(1);
visit[1]=1;
bool findPath=0;
while (!Q.empty())
{
int v=Q.front();
Q.pop();
for(int i=1;i<=m;i++)
{
if(G[v][i]>0&&visit[i]==0)
{
PreSta[i]=v;
visit[i]=1;
if(i==m)
{
findPath=1;
while(!Q.empty())
{
Q.pop();
}
break;
}
else {
Q.push(i);
}
}
}
}
if(!findPath) return 0;
int minflow=999999999;
int tp=m;
while(PreSta[tp])
{
minflow=min(minflow,G[PreSta[tp]][tp]);
tp=PreSta[tp];
}
tp=m;
while (PreSta[tp])
{
G[PreSta[tp]][tp]-=minflow;
G[tp][PreSta[tp]]+=minflow;
tp=PreSta[tp];
}
return minflow;
}
void slove()
{
int ans=0;
int a;
while (a=Augment())
{
ans+=a;
}
printf("%d\n",ans);
}
int main()
{
//freopen("data.in","r",stdin);
while (scanf("%d %d",&n,&m)!=EOF)
{
init();
slove();
}
return 0;
}POJ 1273 Drainage Ditches 网络流基础,布布扣,bubuko.com
POJ 1273 Drainage Ditches 网络流基础
原文:http://blog.csdn.net/alpc_paul/article/details/38553005