Pagini recente » Cod sursa (job #2522908) | Cod sursa (job #1018586) | Cod sursa (job #2608039) | Cod sursa (job #2354670) | Cod sursa (job #1980917)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define MAXN 1030
using namespace std;
vector<int> lista[MAXN];
int n, m;
bool vizitat[MAXN];
int tata[MAXN];
int residual[MAXN][MAXN], cap[MAXN][MAXN];
void read(){
fstream f("maxflow.in",ios::in);
int a, b, c, i, j;
f >> n >> m;
while(f >> a >> b >> c){
lista[a].push_back(b);
lista[b].push_back(a);
residual[a][b] = residual[a][b] + c;
}
}
void set_vizitat(){
for(int i = 1;i <= n; ++i)
vizitat[i] = false;
}
int BFS(){
set_vizitat();
vizitat[1] = true;
queue<int> q;
q.push(1);
while(!q.empty()){
int nod = q.front();
int len = lista[nod].size();
q.pop();
for(int i = 0;i < len; ++i)
if(!vizitat[lista[nod][i]] && residual[nod][lista[nod][i]] > 0){
tata[lista[nod][i]] = nod;
vizitat[lista[nod][i]] = true;
q.push(lista[nod][i]);
}
}
return vizitat[n];
}
void solve(){
int minim, total = 0, x;
for (total = 0; BFS();){
int len = lista[n].size();
tata[n] = x;
x = n;
minim = INF;
while(x != 1){
minim = min(minim,residual[tata[x]][x]);
x = tata[x];
}
x = n;
if(minim > 0)
while(x != 1){
residual[tata[x]][x] = residual[tata[x]][x] - minim;
residual[x][tata[x]] = residual[x][tata[x]] + minim;
x = tata[x];
}
total += minim;
}
fstream g("maxflow.out",ios::out);
g << total;
}
int main(){
read();
solve();
return 0;
}