Cod sursa(job #765520)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 7 iulie 2012 23:51:17
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
#include <string.h>

#define MAX 1005
#define INF 0x3f3f3f3f

using namespace std;

vector<int> G[MAX];
int viz[MAX], C[MAX][MAX], F[MAX][MAX], queue[MAX], n, m, a, b, c, flow, minflow, TT[MAX];

bool BF()
{
    int sNod, fNod;
    queue[0] = queue[1] = 1;
    memset(viz, 0, MAX * sizeof(int));viz[1] = 1;
    for(int i = 1; i <= queue[0]; i++)
    {
        sNod = queue[i];
        for(int j = 0; j < G[sNod].size(); j++)
        {
            fNod = G[sNod][j];
            if(C[sNod][fNod] == F[sNod][fNod] || viz[fNod]) continue;
            viz[fNod] = 1; queue[++queue[0]] = fNod;
            TT[fNod] = sNod;
        }
    }
    return viz[n];
}

int main()
{
    ifstream in("maxflow.in"); in>>n>>m; int nod;
    for(;m--;)
    {
        in>>a>>b>>c;
        G[a].push_back(b); G[b].push_back(a);
        C[a][b] = c;
    } in.close();
    for(flow = 0; BF();)
        for(int i = 0; i < G[n].size(); i++)
        {
            nod = G[n][i];
            if(F[ nod ][ n ] == C[ nod ][ n ] || !viz[ nod ]) continue;
            TT[n] = nod;
            minflow = INF;
            for(int nod = n; nod != 1; nod = TT[nod])
                minflow = min(minflow, C[ TT[ nod ] ][ nod ] - F[ TT[ nod ] ][ nod ]);
            if(!minflow) continue;
            for(int nod = n; nod != 1; nod = TT[nod])
            {
                F[ TT[ nod ] ][ nod ] += minflow;
                F[ nod ][ TT[ nod ] ] -= minflow;
            }
            flow += minflow;
        }
    ofstream out("maxflow.out"); out<<flow; out.close();
    return 0;
}