Pagini recente » Cod sursa (job #1382512) | Cod sursa (job #2282879) | Cod sursa (job #1651713) | Cod sursa (job #576692) | Cod sursa (job #1464086)
#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, viz[MAX], path[MAX], C[MAX][MAX], G[MAX][MAX], x, y, z;
long long flux;
bool bfs();
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
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(bfs()){
for(i = 0; i < l[n].size(); i++)
if(viz[l[n][i]] && C[l[n][i]][n] != G[l[n][i]][n]){
path[n] = l[n][i];
int minim = INF;
int v = n;
while(v != 1){
int u = path[v];
minim = min(minim, C[u][v] - G[u][v]);
v = u;
}
flux += minim;
v = n;
while(v != 1){
int u = path[v];
G[u][v] += minim;
G[v][u] -= minim;
v = u;
}
}
}
printf("%lld\n", flux);
return 0;
}
bool bfs(){
viz[1] = 1;
for(i = 2; i <= n; i++)
viz[i] = 0;
queue<int> q;
q.push(1);
while(!q.empty()){
int aux = q.front();
q.pop();
if(aux != n)
for(i = 0; i < l[aux].size(); i++)
if(C[aux][l[aux][i]] != G[aux][l[aux][i]] && !viz[l[aux][i]]){
viz[l[aux][i]] = 1;
path[l[aux][i]] = aux;
q.push(l[aux][i]);
}
}
return viz[n];
}