Cod sursa(job #1153333)

Utilizator StanAndreiAndrei Stan StanAndrei Data 25 martie 2014 13:28:04
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>

#define NMAX 1005
#define INF 0x3f3f3f3f

using namespace std;

vector<int> G[NMAX];
queue<int> Q;
bool viz[NMAX];

int N,M,S,D;
int P[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX];
int FLOW;

void read()
{
    scanf("%d %d\n",&N,&M);
    S=1;
    D=N;

    for (int i=1;i<=M;i++)
    {
        int a,b,c;
        scanf("%d %d %d\n",&a,&b,&c);
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b]=c;
    }
}

int BFS()
{
    Q.push(S);
    for (int i=1;i<=N;i++) {viz[i]=0;P[i]=0;}
    viz[S]=1;

    while (!Q.empty())
    {
        int node=Q.front();
        Q.pop();

        if (node!=N)
            for (int i=0;i<G[node].size();i++)
                if (!viz[G[node][i]] && F[node][G[node][i]]<C[node][G[node][i]])
                {
                    viz[G[node][i]]=1;
                    P[G[node][i]]=node;
                    Q.push(G[node][i]);
                }
    }

    return viz[D];
}

void solve()
{
    int val,node;

    while (BFS())
    {
        for (int i=0;i<G[N].size();i++)
        if(viz[G[N][i]] && F[G[N][i]][N]<C[G[N][i]][N])
        {
            val=INF;
            node=N;
            P[N]=G[N][i];
            while (P[node])
            {
                val=min(val,C[P[node]][node]-F[P[node]][node]);
                node=P[node];
            }

            node=N;
            if (val)
                while (P[node])
                {
                    F[P[node]][node]+=val;
                    F[node][P[node]]-=val;
                    node=P[node];
                }
            FLOW+=val;
        }
    }

    printf("%d\n",FLOW);
}

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

    read();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}