裸网络流,注意一下可能又重边就可。
献上一个Dinic模板
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; #define N 210 int g[N][N]; class Dinic { public: static const int INF = 1000000007, SIZE = 205; int c[SIZE][SIZE]; int n,s,t,l[SIZE],e[SIZE]; int flow(int maxf = INF) { int left=maxf; while(build()) left-=push(s,left); return maxf-left; } int push(int x, int f) { if(x==t) return f; int& y=e[x],sum=f; for(; y<n; y++) if(c[x][y]>0 && l[x]+1==l[y]) { int cnt=push(y,min(sum,c[x][y])); c[x][y]-=cnt; c[y][x]+=cnt; sum-=cnt; if(!sum) return f; } return f-sum; } bool build() { int m=0; memset(l,-1,sizeof(l)); l[e[m++]=s]=0; for(int i=0; i<m; i++) for(int y=0; y<n; y++) if(c[e[i]][y]>0 && l[y]<0) l[e[m++]=y]=l[e[i]]+1; memset(e,0,sizeof(e)); return l[t]>=0; } } net; void Init(int n) { memset(net.c, 0, sizeof(net.c)); for (int i=0; i<n; i++) for (int j=0; j<n; j++) net.c[i][j] = g[i][j]; net.s = 0; net.t = n-1; net.n = n; } int main() { int n, m, a, b, c; while (scanf("%d%d", &m, &n) == 2) { memset(g, 0, sizeof(g)); while (m--) { scanf("%d%d%d", &a, &b, &c); a--, b--; g[a][b] += c; //有向图,重边 } Init(n); int ans = net.flow(); cout << ans << endl; } return 0; }