Pagini recente » Cod sursa (job #2059927) | Cod sursa (job #2083984) | Cod sursa (job #1428519) | Cod sursa (job #2828129) | Cod sursa (job #1464057)
#include <stdio.h>
#include <vector>
#include <queue>
#define MAX 1001
#define INF 1<<30
#define min(a,b) (a < b ? a : b)
using namespace std;
vector<int> l[MAX];
int n, m, i, path[MAX], C[MAX][MAX], G[MAX][MAX], x, y, z;
long long flux;
void bfs(int* dim);
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int dim;
scanf("%d%d", &n, &m);
for(i = 0; i < m; i++){
scanf("%d%d%d", &x, &y, &z);
C[x][y] = z;
l[x].push_back(y);
l[y].push_back(x);
}
while(1){
bfs(&dim);
if(!dim)
break;
flux += dim;
int v = n;
while(v != 1){
int u = path[v];
G[u][v] += dim;
G[v][u] -= dim;
v = u;
}
}
printf("%lld\n", flux);
return 0;
}
void bfs(int* dim){
path[1] = -2;
for(i = 2; i <= n; i++)
path[i] = -1;
int m[n + 1];
m[1] = INF;
queue<int> q;
q.push(1);
while(!q.empty()){
int aux = q.front();
q.pop();
for(vector<int>::iterator it = l[aux].begin(); it < l[aux].end(); it++)
if(C[aux][*it] - G[aux][*it] > 0 && path[*it] == -1){
path[*it] = aux;
m[*it] = min(m[aux], C[aux][*it] - G[aux][*it]);
if(*it != n)
q.push(*it);
else{
*dim = m[n];
return;
}
}
}
*dim = 0;
return;
}