Pagini recente » Cod sursa (job #2835562) | Cod sursa (job #2523139) | Cod sursa (job #819326) | Cod sursa (job #587156) | Cod sursa (job #923933)
Cod sursa(job #923933)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define NMAX 1001
using namespace std;
vector < int >Graf[NMAX];
int vizitat[NMAX];
int father[NMAX];
int Flow[NMAX][NMAX];
int Capacitate[NMAX][NMAX];
queue < int > q;
int n,m,flow,capacitate_reziduala;
void citesc(){
int x,y,cap;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&cap);
Capacitate[x][y] = cap;
Graf[x].push_back(y);
Graf[y].push_back(x); // construiesc graful rezidual
}
}
int BFS(){ // Parcurg un drum de ameliorare
memset(vizitat,0,sizeof(vizitat));
vizitat[1] = 1;
q.push(1);
int nod;
while(!q.empty()){
nod = q.front();
q.pop();
for(register int i=0;i<Graf[nod].size();++i){
if(Flow[nod][Graf[nod][i]] == Capacitate[nod][Graf[nod][i]] || vizitat[Graf[nod][i]]) // Daca nu mai pot mari fluxul sau deja a mai fost vizitat nodul curent continui cautarea
continue;
vizitat[Graf[nod][i]] = 1;
q.push(Graf[nod][i]);
father[Graf[nod][i]] = nod;
}
}
return vizitat[n];
}
void Max_Flow(){
while(BFS()){ // atata timp cat am un drum de la sursa la destinatie
capacitate_reziduala = 0x3f3f3f3f;
for(register int i=n;i!=1;i=father[i]) // plec de la n deoarece n este o frunza a arborelui de tip father
capacitate_reziduala = min(capacitate_reziduala,Capacitate[father[i]][i] - Flow[father[i]][i]); //daca mai creste fluxul ma asigur ca il voi creste cu
//cea mai mica diferenta dintre cap si fluxul curent de pe un arc
flow+=capacitate_reziduala;
for(register int i=n;i!=1;i=father[i]){ // legea conservarii fluxului: cantitatea de flux ce intra intr-un nod este egala cu cant de flux ce iese din nod
Flow[father[i]][i]+=capacitate_reziduala; // scad cap reziduala de la i la father[i] in caz ca eu am arc de la i la father[i]
Flow[i][father[i]]-=capacitate_reziduala;
}
}
printf("%d",flow);
}
int main(){
citesc();
Max_Flow();
return 0;
}