网络流的简单应用,求源点到终点的最大网络流
用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; }