Pagini recente » Cod sursa (job #2926075) | Cod sursa (job #2378675) | Cod sursa (job #1421626) | Cod sursa (job #1678509) | Cod sursa (job #983620)
Cod sursa(job #983620)
#include <iostream>
#include <fstream>
using namespace std;
int m,n,l,c,ax,mx,i;
int v[1024][1024];
struct arbore
{
int flux,ant;
} arb[1024];
void construct()
{
int st[1024],b[1024],nst,pos,i,ax;
for (i=0;i<1024;i++)
arb[i].flux=arb[i].ant=st[i]=b[i]=0;
arb[1].flux=999999999;
st[1]=1;
nst=1;
pos=1;
b[1]=1;
while (st[pos]!=0)
{
for (i=2;i<n;i++)
if ((v[st[pos]][i]!=0)&&(b[i]==0))
{
nst++;
st[nst]=i;
b[i]=1;
ax=arb[i].flux;
arb[i].flux=max(arb[i].flux,min(v[st[pos]][i],arb[st[pos]].flux));
if (arb[i].flux!=ax)
arb[i].ant=st[pos];
}
pos++;
}
}
int go()
{
int val,mn,pos,i;
val=0;
for (i=1;i<n;i++)
if (v[i][n]!=0)
{
mn=v[i][n];
pos=i;
while (pos>1)
{
if (arb[pos].flux<mn)
mn=arb[pos].flux;
pos=arb[pos].ant;
}
if (pos==0)
mn=0;
val+=mn;
v[i][n]-=mn;
v[n][i]+=mn;
pos=i;
while (pos>1)
{
v[arb[pos].ant][pos]-=mn;
v[pos][arb[pos].ant]+=mn;
arb[pos].flux-=mn;
pos=arb[pos].ant;
}
}
return val;
}
int main(void)
{
FILE * f;
f=fopen("maxflow.in","r");
ofstream g("maxflow.out");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d",&l,&c);
fscanf(f,"%d",&v[l][c]);
}
construct();
ax=go();
while (ax!=0)
{
mx+=ax;
construct();
ax=go();
}
g<<mx;
g.close();
return 0;
}