Cod sursa(job #1212203)

Utilizator thewildnathNathan Wildenberg thewildnath Data 24 iulie 2014 02:37:22
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;

#define NMAX 1002
#define INF 200000000

int n,m,sol;
int t[NMAX],f[NMAX][NMAX],val[NMAX];

vector<int>v[NMAX];

struct cmp
{
    bool operator()(const int &a,const int &b)
    {
        return val[a]>val[b];
    }
};

priority_queue<int,vector<int>, cmp>q;

bool drum()
{
    int i,nod,fiu;

    while(!q.empty())
        q.pop();
    memset(t,0,sizeof(t));
    memset(val,0,sizeof(val));

    t[1]=1;
    val[1]=1;
    nod=1;
    q.push(nod);

    while(!q.empty())
    {
        nod=q.top();
        q.pop();

        for(i=0;i<v[nod].size();++i)
        {
            fiu=v[nod][i];

            if(f[fiu][nod] && !t[fiu] && (val[fiu]==0 || val[fiu]>val[nod]+1))
            {
                t[fiu]=nod;
                val[fiu]=val[nod]+1;

                if(fiu==n)
                    return 1;

                q.push(fiu);
            }
        }
    }

    return 0;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,maxc,x,y,c;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back(y);
        v[y].push_back(x);

        f[y][x]=c;
    }

    while(drum())
    {
        maxc=INF;
        for(i=n;i!=1;i=t[i])
            if(f[i][t[i]]<maxc)
                maxc=f[i][t[i]];

        for(i=n;i!=1;i=t[i])
        {
            f[i][t[i]]-=maxc;
            f[t[i]][i]+=maxc;
        }

        sol+=maxc;
    }

    printf("%d\n",sol);

    return 0;
}