Pagini recente » Cod sursa (job #2496962) | Cod sursa (job #1554406) | Cod sursa (job #2478599) | Cod sursa (job #2610900) | Cod sursa (job #1542058)
#include<cstdio>
#include<cstring>
#include<vector>
#define inf 200000000
using namespace std;
int capacity[1010][1010],flow[1010][1010],seen[1010],dad[1010],q[1010],n;
vector<int> g[1010];
int minim(int a,int b){
if(a<b)
return a;
return b;
}
int bfs(){
int start=1,finish=1,node,i;
memset(seen,0,sizeof(seen));
q[1]=1;
seen[1]=1;
while(start<=finish){
node=q[start];
start++;
if(node==n)
continue;
for(i=0;i<g[node].size();i++){
if(seen[g[node][i]]==1||capacity[node][g[node][i]]==flow[node][g[node][i]])
continue;
seen[g[node][i]]=1;
finish++;
q[finish]=g[node][i];
dad[g[node][i]]=node;
}
}
return seen[n];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int m,maxflow=0,add,i,a,b,c,node;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
capacity[a][b]+=c;
g[a].push_back(b);
g[b].push_back(a);
}
while(bfs()==1)
for(i=0;i<g[n].size();i++){
node=g[n][i];
if(flow[node][n]==capacity[node][n]||seen[node]==0)
continue;
dad[n]=node;
add=inf;
for(node=n;node!=1;node=dad[node])
add=minim(add,capacity[dad[node]][node]-flow[dad[node]][node]);
if(add==0)
continue;
for(node=n;node!=1;node=dad[node]){
flow[dad[node]][node]+=add;
flow[node][dad[node]]-=add;
}
maxflow+=add;
}
printf("%d",maxflow);
return 0;
}