Cod sursa(job #1013018)

Utilizator george_stelianChichirim George george_stelian Data 20 octombrie 2013 01:13:24
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 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];
int i,x,y,z,nod,n,m,ss,s1;

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

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(n)
    {
        for(i=1;i<=n;i++) a[i]=0;
        z=0;
        mf(1);
        if(z)
        {
            nod=t[n];
            s1=c[nod][n]-s[nod][n];
            while(nod>1)
            {
                z=nod;
                nod=t[z];
                s1=min(s1,c[nod][z]-s[nod][z]);
            }
            ss+=s1;
            nod=t[n];
            s[nod][n]-=s1;
            s[n][nod]+=s1;
            while(nod>1)
            {
                z=nod;
                nod=t[z];
                s[nod][z]+=s1;
                s[z][nod]-=s1;
            }
        }
        else break;
    }
    printf("%d",ss);
    fclose(stdin);
    fclose(stdout);
    return 0;
}