Pagini recente » Cod sursa (job #1410400) | Cod sursa (job #1342951) | Cod sursa (job #657015) | Cod sursa (job #2728528) | Cod sursa (job #1980757)
#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("fisier.in",ios::in);
int a, b, c, i, j;
f >> n >> m;
for(i = 1;i <= n; ++i)
for(j = 1;j <= n; ++j)
cap[i][j] = flow[i][j] = 0;
while(f >> a >> b >> c){
lista[a].push_back(b);
lista[b].push_back(a);
cap[a][b] = cap[a][b] + c;
}
for(int i = 1;i <= n; ++i){
vizitat[i] = false;
tata[i] = 0;
}
}
int BFS(){
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]] && cap[nod][lista[nod][i]] != flow[nod][lista[nod][i]]){
tata[lista[nod][i]] = nod;
vizitat[lista[nod][i]] = true;
q.push(lista[nod][i]);
if(lista[nod][i] == n)
return 1;
}
}
}
return 0;
}
void set_vizitat(){
for(int i = 1;i <= n; ++i)
vizitat[i] = false;
}
void solve(){
int minim, total = 0, x;
for (total = 0; BFS();){
set_vizitat();
x = n;
minim = cap[tata[x]][x] - flow[tata[x]][x];
if(cap[tata[x]][x] == flow[tata[x]][x])
continue;
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;
}