Cod sursa(job #239045)

Utilizator RobybrasovRobert Hangu Robybrasov Data 3 ianuarie 2009 22:59:20
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <queue>
#define N 20
#define inf 110010

using namespace std;

typedef struct noduri
{
    int val;
    noduri *urm;
} adr;

int n,m,i,j,x,y,z,tata[N],f[N][N],cp,rez;
char E[N];
char ok;
adr *L[N],*p;
queue<int> C;

void bfs()
{
    E[1]=1;
    for (C.push(1); !C.empty(); C.pop())
        for (p=L[C.front()]; p; p=p->urm)
            if (!E[p->val] && f[C.front()][p->val]>0)
            {
                tata[p->val]=C.front();
                if (p->val==n) return;
                E[p->val]=1;
                C.push(p->val);
            }
    ok=0;
}

void clear()
{
    memset(tata,0,sizeof(tata));
    memset(E,0,sizeof(E));
    for (; !C.empty(); C.pop());
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    memset(tata,0,sizeof(tata));
    for (i=1; i<=m; i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        p=new adr;
        p->val=y; p->urm=L[x];
        L[x]=p;
        p=new adr;
        p->val=x; p->urm=L[y];
        L[y]=p;
        f[x][y]=z;
    }
    ok=1;
    rez=0;
    bfs();
    while (ok)
    {
        cp=inf;
        for (i=n; tata[i]>0; i=tata[i])
            if (f[tata[i]][i]<cp) cp=f[tata[i]][i];
        rez+=cp;
        for (i=n; tata[i]>0; i=tata[i])
        {
            f[tata[i]][i]-=cp;
            f[i][tata[i]]+=cp;
        }
        clear();
        bfs();
    }
    printf("%d",rez);

    return 0;
}