Cod sursa(job #1262862)

Utilizator thewildnathNathan Wildenberg thewildnath Data 13 noiembrie 2014 16:53:04
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>

using namespace std;

#define NMAX 1002
#define INF 2000000000

int n, m, sol, s, f, nrs;
int flow[NMAX][NMAX], t[NMAX], fin[NMAX];

vector<int> v[NMAX];

queue<int> q;

void bfs(int nod)
{
    memset(t, 0, sizeof(t));
    while(!q.empty())q.pop();

    nrs=0;

    t[s]=s;
    q.push(nod);

    int fiu;

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

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

            if(!t[fiu] && flow[nod][fiu]>0)
            {
                if(fiu==f)
                {
                    fin[++nrs]=nod;

                    continue;
                }

                t[fiu]=nod;

                q.push(fiu);
            }
        }
    }
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    int x, y, c, fmin;

    scanf("%d%d", &n, &m);

    s=1;
    f=n;

    for(int i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &x, &y, &c);

        v[x].push_back(y);
        v[y].push_back(x);

        flow[x][y]=c;
    }

    while(true)
    {
        bfs(s);

        if(!nrs)break;

        for(int j=1; j<=nrs; ++j)
        {
            fmin=INF;

            t[f]=fin[j];

            for(int nod=f; t[nod]!=nod; nod=t[nod])
                if(flow[t[nod]][nod]<fmin)
                    fmin=flow[t[nod]][nod];

            for(int nod=f; t[nod]!=nod; nod=t[nod])
            {
                flow[t[nod]][nod]-=fmin;
                flow[nod][t[nod]]+=fmin;
            }

            sol+=fmin;
        }
    }

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

    return 0;
}