Pagini recente » Cod sursa (job #820255) | Cod sursa (job #1694123) | Cod sursa (job #2872525) | Cod sursa (job #1228374) | Cod sursa (job #1692413)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define nmax 1001
#define inf 0x3f3f3f3f
using namespace std;
int N,M,cap[nmax][nmax],F[nmax][nmax];
int cd[nmax],pred[nmax];
vector <int> G[nmax];
bool viz[nmax];
bool BFS(int s,int d){
int v,nod,i,j;
memset(viz,0,sizeof(viz));
viz[s] = 1;
cd[0] = 1;
cd[1] = s;
for(i = 1;i <= cd[0];i++){
nod = cd[i];
if(nod == d)continue;
for(vector <int> :: iterator it = G[nod].begin();it != G[nod].end();++it){
if(cap[nod][*it] == F[nod][*it] || viz[*it] == 1)continue;
viz[*it] = 1;
cd[++cd[0]] = *it;
pred[*it] = nod;
}
}
return viz[d];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d ",&N,&M);
int x,y,z;
while(M--){
scanf("%d %d %d ",&x,&y,&z);
cap[x][y] = z;
G[x].push_back(y);
G[y].push_back(x);
}
int flow = 0,fmin,s = 1,d = N;
while(BFS(s,d)){
for(vector <int> :: iterator it = G[d].begin();it != G[d].end();++it){
if(cap[*it][d] == F[*it][d] || viz[*it] == 0)continue;
pred[d] = *it;
fmin = inf;
y = d;
while(y != s){
fmin = min(fmin,cap[pred[y]][y] - F[pred[y]][y]);
y = pred[y];
}
if(fmin == 0)continue;
y = d;
while(y != s){
F[pred[y]][y] += fmin;
F[y][pred[y]] -= fmin;
y = pred[y];
}
flow += fmin;
}
}
printf("%d\n",flow);
return 0;
}