Pagini recente » Cod sursa (job #2713731) | Cod sursa (job #2829261) | Cod sursa (job #2225568) | Cod sursa (job #2186883) | Cod sursa (job #2963784)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
//O(N*M^2)
//n - numarul de noduri
//m - numarul de muchii
int n, m, a, b, flow, graf[1001][1001], flux_max;
queue<int> q;
bool viz[1001];
int parent[1001];
int bfs(){
while(!q.empty())
q.pop();
for(int i = 0; i <= n; i++){
parent[i] = 0;
viz[i] = false;
}
//in coada este retinut nodul si capacitatea
q.push(1);
viz[1] = true;
while(!q.empty()){
int nod = q.front();
q.pop();
//cautam care sunt vecinii nodului curent si vedem daca a fost vizitat
//daca nu vedem care este fluxul minim pana la acel nod si il retinem
//daca am ajuns la destinatie returnam fluxul
for(int i = 1; i <= n; i++){
if(!viz[i] && graf[nod][i] > 0){
parent[i] = nod;
viz[i] = true;
if(i == n){
return true;
}
q.push(i);
}
}
}
return 0;
}
int flux_maxim(){
//daca am gasit un path atunci adunam fluxul la total si trecem prin path folosind vectorul de tati ca sa reconstruim graful
flux_max = 0;
while(bfs()){
for(int i = 1; i <= n; i++){
if(graf[i][n] && parent[i]){
parent[n] = i;
int flux = 1000001, nod_curent = n;
while(nod_curent != 1){
flux = min(flux, graf[parent[nod_curent]][nod_curent]);
nod_curent = parent[nod_curent];
}
nod_curent = n;
while(nod_curent != 1){
int prev = parent[nod_curent];
graf[nod_curent][prev] += flux;
graf[prev][nod_curent] -= flux;
nod_curent = prev;
}
flux_max += flux;
}
}
}
return flux_max;
}
int main(){
fin >> n >> m;
for(int i = 0; i < m; i ++){
fin >> a >> b >> flow;
graf[a][b] = flow;
}
fout << flux_maxim();
}