网络流的简单应用,求源点到终点的最大网络流
用EK算法
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <queue>
#include <limits.h>
#define MAX 250
using namespace std;
int cap[MAX][MAX];
int m;
int EKarp(int s,int t)
{
queue<int> Q;
int flow[MAX][MAX],a[MAX],u,v,f,pre[MAX];
f = 0;
memset(flow,0,sizeof(flow));
while(1)
{
Q.push(s);
memset(a,0,sizeof(a));
a[s]=INT_MAX;
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(v=1;v<=m;v++)
if(!a[v]&&cap[u][v]>flow[u][v])
{
a[v]=min(a[u],cap[u][v]-flow[u][v]);
Q.push(v);
pre[v]=u;
}
}
if(a[t]==0)
break;
for(u=t;u!=s;u=pre[u])
{
flow[pre[u]][u]+=a[t];
flow[u][pre[u]]-=a[t];
}
f+=a[t];
}
return f;
}
int main()
{
int from,to,c,n,ans;
while( scanf("%d%d",&n,&m) != EOF )
{
memset(cap,0,sizeof(cap));
while( n-- )
{
scanf("%d%d%d",&from,&to,&c);
cap[from][to] += c;
}
ans = EKarp(1,m);
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号