网络流板子题,直接套用。
1.cnt–边的数量,从0开始
2.head[]–每一个点最后一条边的编号
3.next–每一条边的下一条边,同一个起点对应。
4.v–每一条边指向的点
5.w–每一条边的残量
6.level[]–标记分层深度
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 205;
const int maxe = 4 * maxn * maxn;
struct MaxFlow {
struct Edge {
int v, w, nxt;
} edge[maxe];
int head[maxn], tot, level[maxn];
void init(){
memset(head,-1,sizeof(head));
tot=0;
}
void add(int u, int v, int w) {
edge[tot].v = v;
edge[tot].w = w;
edge[tot].nxt = head[u];
head[u] = tot++;
edge[tot].v = u;
edge[tot].w = 0;
edge[tot].nxt = head[v];
head[v] = tot++;
}
bool bfs(int s, int t) {
memset(level, -1, sizeof(level));
queue<int>q;
q.push(s);
level[s] = 0;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = head[u]; ~i; i = edge[i].nxt) {
if(edge[i].w > 0 && level[edge[i].v] < 0) {
level[edge[i].v] = level[u] + 1;
q.push(edge[i].v);
}
}
}
return level[t] > 0;
}
int dfs(int u, int t, int f) {
if(u == t) return f;
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].v;
if(edge[i].w > 0 && level[v] > level[u]) {
int d = dfs(v, t, min(f, edge[i].w));
if(d > 0) {
edge[i].w -= d;
edge[i ^ 1].w += d;
return d;
}
}
}
level[u] = -1;
return 0;
}
int solve(int s, int t) {
int flow = 0, f;
while(bfs(s, t)) {
while(f = dfs(s, t, inf)) flow += f;
}
return flow;
}
}F;
int main(){
int n,m;
while(~scanf("%d%d",&m,&n)){
F.init();
for(int i=0;i<m;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
F.add(u,v,c);
}
printf("%d\n",F.solve(1,n));
}
return 0;
}