比较简单的网络流。
需要注意的地方:
1、数据中有重边;
2、输入均为单向边。
View Code
#include <stdio.h> #include <string.h> #include <queue> using namespace std; #define MIN(a,b) ((a)<(b)?(a):(b)) #define N 201 #define INF 0x3ffffff int n,m; int g[N][N]; int pre[N]; void EK(int s,int t) { int maxflow=0; int u,v; while(true) { queue<int>q; memset(pre,-1,sizeof(pre)); q.push(s); while(!q.empty()) { u=q.front(),q.pop(); for(v=1;v<=n;v++) if(g[u][v] && pre[v]==-1) { pre[v]=u; q.push(v); } if(pre[t]!=-1) break; } if(pre[t]==-1) break; int aug=INF; for(v=t,u=pre[t];v!=s;v=u,u=pre[u]) { aug=MIN(aug,g[u][v]); } for(v=t,u=pre[t];v!=s;v=u,u=pre[u]) { g[u][v]-=aug; g[v][u]+=aug; } maxflow+=aug; } printf("%d\n",maxflow); } int main() { int u,v,w; while(~scanf("%d%d",&m,&n)) { for(int i=1;i<=n;i++) memset(g[i],0,sizeof(int)*(n+1)); while(m--) { scanf("%d%d%d",&u,&v,&w); g[u][v]+=w; } EK(1,n); } return 0; }