Cod sursa(job #1013408)

Utilizator george_stelianChichirim George george_stelian Data 20 octombrie 2013 21:21:41
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>

using namespace std;

vector<short int>v[1001];
int c[1001][1001],s[1001][1001];
char a[1001];
short int t[1001],cc[1001];
int i,x,y,z,nod,n,m,ss,s1;

int mf()
{
    for(i=1;i<=n;i++) a[i]=0;
    x=0;
    cc[0]=1;
    for(i=0;i<=x;i++)
    {
        nod=cc[i];
        if(nod==n) continue;
        for(y=0;y<v[nod].size();y++)
        {
            z=v[nod][y];
            if(!a[z] && c[nod][z]-s[nod][z]>0)
            {
                a[z]=1;
                t[z]=nod;
                cc[++x]=z;
                if(z==n) return true;
            }
        }
    }
    return false;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z;
    }
    ss=0;
    while(mf())
    {
        for(i=0;i<v[n].size();i++)
        {
            if(a[v[n][i]]&&c[v[n][i]][n]-s[v[n][i]][n]>0)
            {
                t[n]=v[n][i];
                s1=1000000000;
                for(nod=n;nod>1;nod=t[nod])
                {
                    s1=min(s1,c[t[nod]][nod]-s[t[nod]][nod]);
                }
                ss+=s1;
                for(nod=n;nod>1;nod=t[nod])
                {
                    c[t[nod]][nod]-=s1;
                    s[t[nod]][nod]+=s1;
                }
            }
        }
    }
    printf("%d",ss);
    fclose(stdin);
    fclose(stdout);
    return 0;
}