Pagini recente » Cod sursa (job #2235694) | Cod sursa (job #187597) | Cod sursa (job #842267) | Cod sursa (job #1382139) | Cod sursa (job #1938705)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
#define LE 1066
int M[LE][LE];
int infinit=100000000;
bool viz[LE];
int n,m;
int father[LE];
int drum[LE];
void dfs(int nod){
viz[nod]=true;
for(int i=1;i<=n;++i){
if (viz[i]==false){
if (M[nod][i]>0){
dfs(i);
father[i]=nod;
}
}
}
}
int main(){
f>>n>>m;
for(int i=1;i<=m;++i){
int xx,yy,cc;
f>>xx>>yy>>cc;
M[xx][yy]=cc;
}
int flux_final=0;
while (true){
for(int i=1;i<=n;++i){
viz[i]=false;
}
dfs(1);
if (viz[n]==false){
break;
}
//gasire drum (in ordine inversa)
int node=n;
int nr_noduri_drum=0;
while (node!=1){
drum[++nr_noduri_drum]=node;
node=father[node];
}
drum[++nr_noduri_drum]=1;
// inversare drum
for(int st=1,dr=nr_noduri_drum;st<dr;++st,--dr){
swap(drum[st],drum[dr]);
}
// gasire cost muchie minima
int fmax=infinit;
for(int i=1;i<nr_noduri_drum;++i){
fmax=min(fmax,M[drum[i]][drum[i+1]]);
}
// modificare graf
for(int i=1;i<nr_noduri_drum;++i){
M[drum[i]][drum[i+1]]-=fmax;
M[drum[i+1]][drum[i]]+=fmax;
}
flux_final+=fmax;
}
g<<flux_final<<'\n';
}