Cod sursa(job #1212202)

Utilizator thewildnathNathan Wildenberg thewildnath Data 24 iulie 2014 02:35:33
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 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 nodc
{
    int x,c;
}nod,fiu;

struct cmp
{
    bool operator()(const nodc &a,const nodc &b)
    {
        return a.c>b.c;
    }
};

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

bool drum()
{
    int i;

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

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

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

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

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

                if(fiu.x==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;
}