Cod sursa(job #891640)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 25 februarie 2013 18:30:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 1024
using namespace std;

vector<int> G[NMAX];
int n,m,C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX],cd[NMAX];
bool viz[NMAX];

int bf()
{
    int i, j, nod, V;

    cd[0] = 1;
    cd[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;

    for (i = 1; i <= cd[0]; i++)
    {
        nod = cd[i];
                if (nod == n) continue;
        for (j = 0; j < G[nod].size(); j++)
            {
                V = G[nod][j];
                if (C[nod][V] == F[nod][V] || viz[V]) continue;
                viz[V] = 1;
                cd[ ++cd[0] ] = V;
                T[V] = nod;
            }
    }

    return viz[n];
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin>>n>>m;
    int x,y,z,flow,fmin;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        C[x][y]+=z;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    flow=0;
    for(flow=0;bf();)
    {
            for(int i=0;i<G[n].size();i++)
            {
                int nod=G[n][i];
                if(F[nod][n]==C[nod][n] || !viz[nod]) continue;
                T[n]=nod;
                fmin=INF;

                for(nod=n; nod!=1; nod=T[nod])
                    fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);

                if(fmin == 0) continue;

                for (nod = n; nod != 1; nod = T[nod])
                {
                    F[ T[nod] ][nod] += fmin;
                    F[nod][ T[nod] ] -= fmin;
                }
                flow+=fmin;
            }
    }
    fout<<flow;
    return 0;
}