裸网络流,注意一下可能又重边就可。
献上一个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;
}