Pagini recente » Cod sursa (job #532590) | Cod sursa (job #1037244) | Cod sursa (job #2696584) | Cod sursa (job #1713853) | Cod sursa (job #582000)
Cod sursa(job #582000)
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,fluxmax;
bool viz[1010];
FILE *f;
FILE *g;
typedef struct nod
{
int inf,c;
nod *urm,*inv;
} NOD;
typedef NOD *graf[1010];
graf G;
void citire()
{
f=fopen("maxflow.in","r");
fscanf(f,"%d %d",&n,&m);
NOD *p;
for(int i=1;i<=m;i++)
{
int x,y,C;
fscanf(f,"%d %d %d",&x,&y,&C);
p=new NOD;
p->inf=y;
p->urm=G[x];
p->c=C;
NOD *q=p;
G[x]=p;
p=new NOD;
q->inv=p;p->inv=q;
p->inf=x;
p->urm=G[y];
p->c=0;
G[y]=p;
}
}
int minimul(int a,int b)
{
if(a<b)
return a;
return b;
}
int DF(int k,int minn)
{
NOD *p=G[k];
while(p)
{
if(!viz[p->inf]&&p->c>0)
{
viz[p->inf]=true;
if(p->inf==n)
{
viz[p->inf]=false;
int x=minimul(p->c,minn);
p->c-=x;
p->inv->c+=x;
return x;
}
else
{
int df=DF(p->inf,minimul(p->c,minn));
if(df)
{
viz[p->c]=false;
p->c-=df;
p->inv->c+=df;
return df;
}
viz[p->inf]=false;
}
}
p=p->urm;
}
return 0;
}
int main()
{
citire();
int df=DF(1,INF);
while(df)
{
fluxmax+=df;
df=DF(1,INF);
}
g=fopen("maxflow.out","w");
fprintf(g,"%d\n",fluxmax);
fclose(f);
fclose(g);
return 0;
}