Cod sursa(job #1127754)

Utilizator PatrikStepan Patrik Patrik Data 27 februarie 2014 13:43:04
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
    #include<cstdio>
    #include<vector>
    #include<iostream>
    #include<cstring>
    using namespace std;
    #define MAX 1001
    #define pb push_back
    int N , M  , C[MAX][MAX] , F[MAX][MAX] , t[MAX] , fmin, maxflow , L[MAX];
    bool u[MAX];
    vector<int> G[MAX];

    void read();
    void solve();
    bool BFS();
    void write();

    int main()
    {
        read();
        solve();
        write();
        return 0;
    }

    void read()
    {
        int x , y , c;
        freopen("maxflow.in" , "r" , stdin );
        scanf("%d%d" , &N , &M );
        for(int i = 1 ; i<= M ; ++i )
        {
            scanf("%d%d%d" , &x , &y , &c);
            G[x].pb(y);
            G[y].pb(x);
            C[x][y] =  c;
        }
    }

    void solve()
    {
        while(BFS())
        {
            for(int i = 0 ; i < (int)G[N].size() ; ++i )
            {
                if(C[G[N][i]][N] > F[G[N][i]][N])
                    t[N] = G[N][i];
                fmin = C[t[N]][N]-F[t[N]][N];
                for(int nod = N;nod!=1;nod = t[nod])
                    fmin = min(fmin,C[t[nod]][nod] - F[t[nod]][nod]);
                for(int nod = N;nod != 1 ; nod = t[nod])
                {
                    F[t[nod]][nod] += fmin;
                    F[nod][t[nod]] -= fmin;
                }
                maxflow+=fmin;
            }
        }
    }

    bool BFS()
    {
        int r;
        memset(u,0,sizeof(u));
        r = L[1] = 1;
        u[1] = 1;
        for(int i = 1 ; i<= r ; ++i )
        {
            if(L[i] == N)continue;
            for(int j = 0 ; j < (int)G[L[i]].size() ; ++j)
            {
                int w = G[L[i]][j];
                if(!u[w] && F[L[i]][w] < C[L[i]][w])
                    {
                        L[++r] = w;
                        t[w] = L[i];
                        u[w] = 1;
                    }
            }
        }
        return u[N];
    }

    void write()
    {
        freopen("maxflow.out" , "w" , stdout );
        printf("%d" , maxflow);
    }