Pagini recente » Cod sursa (job #1476861) | Cod sursa (job #2730086) | Cod sursa (job #2366786) | Cod sursa (job #480449) | Cod sursa (job #369015)
Cod sursa(job #369015)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1010
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define INF 2000000000
vector<int> V[NMAX];
queue<int> q;
int F[NMAX][NMAX], T[NMAX], C[NMAX][NMAX], viz[NMAX];
int n, m;
int min(int x,int y){
if(x>y) return y;
return x;
}
int BFS(){
memset(viz, 0, sizeof(viz));
viz[1]=1;
q.push(1);
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod == n) continue;
FOR(i, V[nod]){
if(viz[*i] || C[nod][*i] == F[nod][*i]) continue;
C[*i][nod]=0;
viz[*i] = 1;
T[*i] = nod;
q.push(*i);
}
}
return viz[n];
}
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);
C[x][y]=z;
C[y][x]=z;
V[x].push_back(y);
V[y].push_back(x);
}
int flow, flowmin;
for( flow = 0; BFS();)
FOR(i, V[n]){
if(C[*i][n] == F[*i][n]) continue;
flowmin = INF;
T[n] = *i;
for(int j = n; j != 1; j=T[j])
flowmin = min( flowmin, C[ T[j] ][j] - F[ T[j] ][j]);
if(flowmin == 0) continue;
for(int j = n; j != 1; j=T[j]){
F[ T[j] ][j] += flowmin;
F[j][ T[j] ] -= flowmin;
}
flow += flowmin;
}
printf("%d\n",flow);
return 0;
}