哈哈,我的第一个网络流!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 0x7ffffff;
struct edge_{
int c, f;
}edge[MAXN][MAXN];
int n, m;
int flag[MAXN], pre[MAXN], alpha[MAXN], que[MAXN];
int h, t, v, u;
int ford(){
while(1){
memset(flag, -1, sizeof(flag));
memset(pre, -1, sizeof(pre));
memset(alpha, -1, sizeof(alpha));
flag[0] = 0, pre[0] = 0, alpha[0] = INF;
t = 0, h = 1;
que[t] = 0;
while(t < h && flag[n - 1] == -1){
u = que[t], t++;
for(v = 0; v < n; v ++){
if(flag[v] == -1){
if(edge[u][v].c < INF && edge[u][v].f < edge[u][v].c){
flag[v] = 0, pre[v] = u;
alpha[v] = min(alpha[u], edge[u][v].c - edge[u][v].f);
que[h] = v, h++;
}
else if(edge[v][u].c < INF && edge[v][u].f > 0){
flag[v] = 0, pre[v] = -u;
alpha[v] = min(alpha[u], edge[v][u].f);
que[h] = v, h++;
}
}
}
flag[u] = 1;
}
if(flag[n - 1] == -1 || alpha[n - 1] == 0)
break;
v = n - 1, u = abs(pre[v]);
int a = alpha[v];
while(1){
if(edge[u][v].f < INF)
edge[u][v].f += a;
else
edge[v][u].f -= a;
if(v == 0)
break;
v = u, u = abs(pre[v]);
}
}
int maxFord = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
if(i == 0 && edge[i][j].f < INF)
maxFord += edge[i][j].f;
if(edge[i][j].f < INF)
printf("%d -> %d : %d\n", i, j, edge[i][j].f);
}
return maxFord;
}
int main(){
freopen("in.in", "r", stdin);
int u, v, c, f;
cin>> n >> m;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
edge[i][j].c = edge[i][j].f = INF;
for(int i = 0; i < m; i++){
cin>> u >> v >> c >> f;
edge[u][v].c = c;
edge[u][v].f = f;
}
cout<< ford() <<endl;
return 0;
}