Pagini recente » Cod sursa (job #1164480) | Cod sursa (job #1089780) | Cod sursa (job #1893533) | Cod sursa (job #1670701) | Cod sursa (job #2960875)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#define inf 9999999
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<vector<int>> lista_ad, capacitate;
vector<int> tata;
int n, m, t, s;
bool bfs(){// verificam daca parcurgerea care incepe din s se termina in t
vector<bool> vizitat(n+ 1, false);
queue<int> coada;
coada.push(s); // incepem de la sursa
vizitat[s]= true;
tata[s]= -1;
while(!coada.empty()){
int u= coada.front();
coada.pop();
for(auto v: lista_ad[u]){
if(vizitat[v]== false && capacitate[u][v]!=0){
tata[v]= u;
if(v==t) return true;
vizitat[v]= true;
coada.push(v);
}
}
}
return false;
}
int edmonds_karp(){
int flow_max= 0;
while(bfs()){
int u, v=t;
int flow_path= INT_MAX;
while(v!= s){
u= tata[v];
if(capacitate[u][v]< flow_path)
flow_path= capacitate[u][v]; // calculam cap min pt fiecare parcurgere
v= tata[v];
}
v = t;
while( v!=s ){
u= tata[v];
capacitate[u][v]-=flow_path;
capacitate[v][u]+= flow_path;
v= tata[v];
}
flow_max+= flow_path;
}
return flow_max;
}
int main()
{
int u, v, capac;
f>>n>>m;
t=n;
s= 1;
lista_ad.resize(n+1);
tata.resize(n+1);
capacitate.resize(n+ 1, vector<int>(n+1));
for(int i=1; i<=m; i++){
f>>u>>v>>capac;
lista_ad[u].push_back(v);
lista_ad[v].push_back(u);
capacitate[u][v]= capac;
}
g<<edmonds_karp();
return 0;
}