Pagini recente » Cod sursa (job #1486885) | Cod sursa (job #1935575) | Cod sursa (job #2034309) | Cod sursa (job #156033) | Cod sursa (job #409699)
Cod sursa(job #409699)
#include<stdio.h>
#include<queue>
using namespace std;
int n,m;
int A[1001][1001];
int viz[1001];
int tacsu[1001];
long f[1001];
long Flux;
queue<int> Q;
void cit();
void rez();
void afis();
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
cit();
rez();
afis();
return 0;
}
void cit() {
scanf("%d%d",&n,&m);
for(int i=1; i<=m;i++) {
long x,y,z;
scanf("%ld%ld%ld",&x,&y,&z);
A[x][y]=z;
}
}
void bf() {
Q.push(1); //nod sursa
viz[1]=1;
//f[1]=666666666;
while(!Q.empty()) {
int x=Q.front();
Q.pop();
for(int i=1; i<=n;i++) { //optm - 1 nod sursa mereu
if(A[x][i]>0 && !viz[i] && i!=n) { //i != destinatie
Q.push(i);
tacsu[i]=x;
viz[i]=1;
//f[i]=min(f[x],A[x][i]);
}
}
}
}
long flux() {
long F=0,R=0;
int i;
bool g=false;
while(!g) {
g=true;
for(i=1; i<=n;i++)
viz[i]=f[i]=0;
R=0;
bf();
for(i=1; i<=n;i++) {
if(A[i][n] && viz[i]) {
g=false;
/*
R+=f[i];
tacsu[n]=i;
scade(n,f[i]);
*/
long R=666666666;
long u=i;
tacsu[n]=i;
for(u=n;tacsu[u];u=tacsu[u])
//R=min(R,A[tacsu[u]][u]);
if(R>A[tacsu[u]][u])
R=A[tacsu[u]][u];
for(u=n;tacsu[u];u=tacsu[u]) {
A[tacsu[u]][u]-=R;
A[u][tacsu[u]]+=R;
}
F+=R;
}
}
}
return F;
}
void rez() {
Flux=flux();
}
void afis() {
printf("%ld", Flux);
}