Pagini recente » Cod sursa (job #1978156) | Cod sursa (job #1448457) | Cod sursa (job #429798) | Cod sursa (job #1770317) | Cod sursa (job #780561)
Cod sursa(job #780561)
#include<cstdio>
#include<list>
using namespace std;
const int inf=1000000;
int i,j,ka,kb,N,M;
list<int> L[1001];
list<int>::iterator it;
int viz[1001];
int cap[1001][1001];
int flux[1001][1001];
int lant[1001];
int t[1001];
int fluxmax,lungime_lant;
int minim,x,y,z;
void mem_set()
{for(i=1; i<=N; i++)
viz[i]=0;}
int BFS()
{mem_set();
lungime_lant=1;
lant[1]=1;
i=1;
while(i<=lungime_lant)
{ka=lant[i];
if(ka==N) break;
for(it=L[ka].begin(); it!=L[ka].end(); it++)
{kb=*it;
if(viz[kb]==0 && cap[ka][kb]>flux[ka][kb])
{viz[kb]=1;
lungime_lant++;
lant[lungime_lant]=kb;
t[kb]=ka;
}
}
i++;}
return viz[N];
}
int main()
{freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d ", &N, &M);
for(i=1; i<=M; i++)
{scanf("%d %d %d ", &x, &y, &z);
cap[x][y]=z;
L[x].push_back(y);
L[y].push_back(x);}
while(BFS())
{for(it=L[N].begin(); it!=L[N].end(); it++)
{kb=*it;
if(viz[kb]==1 && cap[ka][kb]>flux[ka][kb])
t[N]=kb;
minim=inf;
for(i=N; i!=1; i=t[i])
{if(cap[t[i]][i]-flux[t[i]][i]<minim)
minim=cap[t[i]][i]-flux[t[i]][i];}
if(minim==0) continue;
for(i=N; i!=1; i=t[i])
{flux[t[i]][i]+=minim;
flux[i][t[i]]-=minim;}
fluxmax+=minim;
}
}
printf("%d",fluxmax);
return 0;}