Pagini recente » Cod sursa (job #320056) | Cod sursa (job #1329232) | Cod sursa (job #1782380) | Arhiva de probleme | Cod sursa (job #1376618)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int min2(int a,int b){
if(a<b)
return a;
return b;
}
int max2(int a,int b){
if(a>b)
return a;
return b;
}
const int N=1000,INF=110000;
int cap[N+1][N+1];
vector<int>g[N+1];
int can[N+1][N+1];
int father[N+1];
int dist[N+1];
int q[N+1];
bool vis[N+1];
int n,m;
void bfs(){
int l=1,r=1;
q[1]=1;
memset(vis,0,sizeof(vis));
vis[1]=true;
while(l<=r){
int dad=q[l++];
for(unsigned int j=0;j<g[dad].size();j++){
int i=g[dad][j];
if(i==n)
continue;
if(!vis[i])
if(can[dad][i]){
q[++r]=i;
vis[i]=true;
father[i]=dad;
}
}
}
}
int f;
void update(int node){
int start=node;
f=can[node][n];
while(node!=1){
f=min2(f,can[father[node]][node]);
node=father[node];
}
node=start;
while(node!=1){
can[father[node]][node]-=f;
can[node][father[node]]+=f;
node=father[node];
}
can[start][n]-=f;
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
cap[x][y]=z;
can[x][y]=z;
g[x].push_back(y);
g[y].push_back(x);
}
int flow=0;
bool flag=true;
while(flag){
flag=false;
bfs();
for(unsigned int j=0;j<g[n].size();j++){
int i=g[n][j];
if(can[i][n])
if(vis[i]){
update(i);
flow+=f;
if(f)
flag=true;
}
}
}
printf("%d",flow);
return 0;
}