Pagini recente » Cod sursa (job #68222) | Cod sursa (job #3259348) | Cod sursa (job #625881) | Cod sursa (job #2635993) | Cod sursa (job #3271906)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define NMAX 1000
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
int N, M;
bool sel[NMAX + 1];
int t[NMAX + 1];
int c[NMAX + 1][NMAX + 1];
int f[NMAX + 1][NMAX + 1];
vector <int> G[NMAX + 1];
int BFS(int u, int v){
queue <int> Q;
for(int i = 1; i <= N; i++){
sel[i] = 0;
t[i] = -1;
}
Q.push(u);
sel[u] = 1;
t[u] = 0;
while( !Q.empty() ){
int node = Q.front();
Q.pop();
for(auto it : G[node]){
if( !sel[it] && f[node][it] < c[node][it] ){
Q.push(it);
sel[it] = 1;
t[it] = node;
}
}
}
return sel[v];
}
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; i++){
int u, v;
fin >> u >> v;
fin >> c[u][v];
G[u].push_back(v);
G[v].push_back(u);
}
int flux_total = 0;
while( BFS(1, N) ){
//for(auto it : G[N]){
int node = t[N];
//cout << "it = " << it << "\n";
//cout << "node = " << node << "\n";
if(node != -1){
int flux_curent = c[node][N] - f[node][N];
while(node != 1){
int tata = t[node];
flux_curent = min(flux_curent, c[tata][node] - f[tata][node]);
node = tata;
}
flux_total += flux_curent;
node = t[N];
f[node][N] += flux_curent;
f[N][node] -= flux_curent; //graful rezidual
while(node != 1){
int tata = t[node];
f[tata][node] += flux_curent;
f[node][tata] -= flux_curent; //graful rezidual
node = tata;
}
}
//}
//cout << "\n!\n";
}
fout << flux_total << "\n";
}