Cod sursa(job #1072012)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 3 ianuarie 2014 20:20:46
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>

using namespace std;

const int INF = (1<<31)-1;
const int NMAX = 1005;

int N,M,Fm;
vector<int> V[NMAX];

int C[NMAX][NMAX];
int F[NMAX][NMAX];

deque<int> Q;
bool viz[NMAX];
int T[NMAX];

int BFS()
{
    int x,y;
    vector<int>::iterator it;

    Q.resize(0);
    memset(viz,0,sizeof(viz));

    Q.push_back(1);
    viz[1]=1;

    for(; !Q.empty();)
    {
        x=Q.front();
        Q.pop_front();

        for(it=V[x].begin(); it!=V[x].end(); it++)
        {
            y=*it;
            if(C[x][y]==F[x][y] || viz[y]) continue;
            viz[y]=1;
            Q.push_back(y);
            T[y]=x;
        }

    }

    return viz[N];
}

int main()
{
    int x,a,b,c,v;
    vector<int>::iterator it;

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

    scanf("%d%d",&N,&M);

    for(; M; --M)
    {
        scanf("%d%d%d",&a,&b,&c);
        C[a][b]+=c;
        V[a].push_back(b);
        V[b].push_back(a);
    }

    for(; BFS();)
        for(it=V[N].begin();it!=V[N].end();it++)
        {
            x=*it;
            if(C[x][N]==F[x][N] || !viz[x]) continue;
            T[N]=x;

            v=INF;

            for(x=N; x!=1; x=T[x])
                v=min(v,C[T[x]][x]-F[T[x]][x]);

            for(x=N; x!=1; x=T[x])
            {
                F[T[x]][x]+=v;
                F[x][T[x]]-=v;
            }

            Fm+=v;
        }

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

    return 0;
}