Pagini recente » Cod sursa (job #1526540) | Cod sursa (job #2743313) | Cod sursa (job #344664) | Cod sursa (job #1962784) | Cod sursa (job #469096)
Cod sursa(job #469096)
using namespace std;
#include<cstdio>
#define nmax 1001
struct nod { int v; nod *next;};
nod *a[nmax];
int f[nmax][nmax],t[nmax],n,m,c[nmax][nmax];
void add(int x, int y, int z)
{
nod *p=new nod;
p->v=y;
c[x][y]=z;
p->next=a[x];
a[x]=p;
}
void read()
{
int i,x,z,y;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
}
int bfs()
{
int q=1,p=1,Q[nmax],viz[nmax],i,x;
Q[1]=1;
viz[1]=1; t[1]=0;
for(i=2;i<=n;i++) {viz[i]=0; t[i]=0;}
while(p<=q)
{
x=Q[p]; p++;
for(nod *u=a[x];u;u=u->next)
if(!viz[u->v] && f[x][u->v]<c[x][u->v])
{
Q[++q]=u->v;
viz[u->v]=1;
t[u->v]=x;
}
}
if(viz[n]) return 1;
else return 0;
}
int minim(int a, int b) { if(a>b) return b; return a;}
int main()
{
int i,j,min,flux=0;
read();
while(bfs())
{ //for(i=1;i<=n;i++) printf("%d ",t[i]);
for(i=1;i<n;i++)
{
min=c[i][n]-f[i][n];
for(j=i;t[j];j=t[j])
min=minim(min, c[t[j]][j]-f[t[j]][j]);
//printf("\n%d",min);
if(min>0)
{
for(j=i;t[j];j=t[j])
{
f[t[j]][j]+=min;
f[j][t[j]]-=min;
}
f[i][n]+=min;
f[n][i]-=min;
}
}}
for(nod *u=a[1];u;u=u->next)
flux+=f[1][u->v];
freopen("maxflow.out","w",stdout);
printf("%d\n",flux);
return 0;
}