Cod sursa(job #363219)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 12 noiembrie 2009 11:19:58
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#define DIM 1005
#define INF 11005
struct nod
{
	int x;
	nod *urm;
} *lst[DIM];
int n,c[DIM][DIM],f[DIM][DIM],t[DIM],rez,viz[DIM],cd[DIM];
void add (int a,int b)
{
	nod *p=new nod;
	p->x=b;
	p->urm=lst[a];
	lst[a]=p;
}
int min (int a,int b)
{
	if(a<b)
		return a;
	return b;
}
int bf ()
{
	int i,st,dr;
    nod *p;
    for(i=1;i<=n;++i)
        viz[i]=0;
    cd[st=dr=1]=viz[1]=1;
    while(st<=dr)
    {
		for(p=lst[cd[st]];p;p=p->urm)
            if(c[cd[st]][p->x]!=f[cd[st]][p->x] && !viz[p->x])
            {
                cd[++dr]=p->x;
                t[p->x]=cd[st];
                viz[p->x]=1;
                if(p->x==n)
                    return 1;
            }
        ++st;
    }
    return 0;
}

int main ()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,m,x,y,z,minim;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        c[x][y]+=z;
        add(x,y);
        add(y,x);
    }
    while(bf())
    {
        minim=INF;
        for(i=n;i!=1;i=t[i])
            minim=min(minim,c[t[i]][i]-f[t[i]][i]);

        for(i=n;i!=1;i=t[i])
        {
            f[t[i]][i]+=minim;
            f[i][t[i]]-=minim;
        }
        rez+=minim;
    }
	printf("%d",rez);
    return 0;
}