Cod sursa(job #891602)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 25 februarie 2013 18:14:39
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 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];
bool viz[NMAX];

void bf(int nod)
{
    viz[nod]=1;
    if(nod==n);
    else
        for(vector<int>::iterator it=G[nod].begin();it!=G[nod].end();it++)
        {
            int v=*it;
            if(C[nod][v]==F[nod][v] || viz[v]) continue;
            viz[v]=true;
            T[v]=nod;
            bf(v);
        }
}
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);
    }

    memset(viz,0,sizeof(viz));
    bf(1);
    if(viz[n])
    {
        do{
            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;
            }
            memset(viz,0,sizeof(viz));
            bf(1);
        }while(viz[n]);
    }
    fout<<flow;
    return 0;
}