模板题,按题目要求建图跑最大流
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
#define inf 0x7fffffff
struct Edge{
int v,w,nxt;
}g[10001];
int head[10001];
int cnt;
void addEdge(int u,int v,int w){
g[cnt].v = v;
g[cnt].w = w;
g[cnt].nxt = head[u];
head[u] = cnt;
++ cnt;
}
int n,m,x,y,z;
int ans,flow;
int dis[10001];
queue<int> q;
int S,T;
void init(){
memset(head,-1,sizeof(head));
memset(g,0,sizeof(g));
cnt = 0;
memset(dis,-1,sizeof(dis));
while(!q.empty()) q.pop();
ans = 0;
}
int bfs(){
memset(dis,-1,sizeof(dis));
while(!q.empty()) q.pop();
dis[S] = 0;
q.push(S);
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=head[u];i!=-1;i=g[i].nxt){
int v = g[i].v;
if(dis[v]==-1 && g[i].w > 0){
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
return dis[T]!=-1;
}
int dfs(int u,int exp){
if(u==T) return exp;
int flow=0,tmp= 0;
for(int i=head[u];i!=-1;i=g[i].nxt){
int v = g[i].v;
if((dis[v] == (dis[u]+1)) && (g[i].w>0)){
tmp = dfs(v,min(exp,g[i].w));
if(!tmp) continue;
exp -= tmp;
flow += tmp;
g[i].w -= tmp;
g[i^1].w += tmp;
if(!exp) break;
}
}
return flow;
}
int main(){
int f,d,tmp;
while(~scanf("%d%d",&n,&m)){
init();
S =1;T =m;
for(int i=1;i<=n;++i){
scanf("%d%d%d",&x,&y,&tmp);
addEdge(x,y,tmp);
addEdge(y,x,0);
}
while(bfs()){
ans += dfs(S,inf);
}
printf("%d\n",ans);
}
}