Pagini recente » Borderou de evaluare (job #78312) | Cod sursa (job #1726075) | Cod sursa (job #633021) | Cod sursa (job #60750) | Cod sursa (job #695613)
Cod sursa(job #695613)
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
FILE *f,*g;
int n,m,flux[1002][1002],cap[1002][1002];
struct nod
{
int v;
nod *adresa;
};
nod *a[1002];
void adaug(int x,int y,int c)
{
nod *p;
p=new nod;
p->v=y;
p->adresa=a[x];
a[x]=p;
p=new nod;
p->v=-x;
p->adresa=a[y];
a[y]=p;
cap[x][y]=c;
cap[y][x]=c;
}
struct coada
{
int t,f;
};
coada cd[1002];
int main()
{
nod *q;
int i,x,y,c,p,u,viz[1002],min,s,ok;
f=fopen("maxflow.in","rt");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++)
a[i]=0;
for(i=1;i<=n;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
adaug(x,y,c);
}
fclose(f);
ok=1;
while(ok)
{
cd[1].t=0;
cd[1].f=1;
p=1; u=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
min=10000000;
while(p<=u && viz[n]==0)
{
for(q=a[abs(cd[p].f)];q!=0 && viz[n]==0;q=q->adresa)
if(q->v >0 && viz[q->v]==0 && cap[abs(cd[p].f)][q->v] - flux[abs(cd[p].f)][q->v] >0)
{
u++;
cd[u].t=p;
cd[u].f=q->v;
viz[q->v]=1;
}
else
if(q->v <0 && viz[-q->v]==0 && flux[abs(cd[p].f)][-q->v] >0)
{
u++;
cd[u].t=p;
cd[u].f=q->v;
viz[-q->v]=1;
}
p++;
}
ok=viz[n];
if(ok==1)
{
for(i=u;i!=0;i=abs(cd[i].t))
if(cd[cd[i].t].f>0 && cap[abs(cd[cd[i].t].f)][cd[i].f] - flux[abs(cd[cd[i].t].f)][cd[i].f] <min)
min=cap[abs(cd[cd[i].t].f)][cd[i].f] - flux[abs(cd[cd[i].t].f)][cd[i].f];
if(cd[cd[i].t].f<0 && flux[abs(cd[cd[i].t].f)][cd[i].f] <min)
min=flux[abs(cd[cd[i].t].f)][cd[i].f];
for(i=u;i!=0;i=abs(cd[i].t))
if(cd[i].f>0)
flux[abs(cd[cd[i].t].f)][cd[i].f]+=min;
else
flux[abs(cd[cd[i].t].f)][-cd[i].f]-=min;
}
}
s=0;
for(i=1;i<=n;i++)
s=s+flux[1][i];
g=fopen("maxflow.out","wt");
fprintf(g,"%d",s);
fclose(g);
return 0;
}