Pagini recente » Cod sursa (job #2788706) | Cod sursa (job #2666825) | Cod sursa (job #944333) | Cod sursa (job #836393) | Cod sursa (job #1980798)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 1005
using namespace std;
vector<int> lista[MAXN];
int n, m;
bool vizitat[MAXN];
int tata[MAXN];
int flow[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);
cap[a][b] = cap[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();
if(nod == n)
continue;
for(int i = 0;i < len; ++i)
if(!vizitat[lista[nod][i]] && cap[nod][lista[nod][i]] - flow[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();
for(int i = 0;i < len; ++i){
x = lista[n][i];
if(cap[x][n] == flow[x][n] || !vizitat[x])
continue;
tata[n] = x;
x = n;
minim = cap[tata[x]][x] - flow[tata[x]][x];
while(x != 1){
minim = min(minim,cap[tata[x]][x] - flow[tata[x]][x]);
x = tata[x];
}
x = n;
if(minim > 0)
while(x != 1){
flow[tata[x]][x] = flow[tata[x]][x] + minim;
x = tata[x];
}
total += minim;
}
}
fstream g("maxflow.out",ios::out);
g << total;
}
int main(){
read();
solve();
return 0;
}