Cod sursa(job #1413346)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 1 aprilie 2015 20:24:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#include <string.h>
#define NMax 1010
#define INF 1<<30
using namespace std;
std::vector<int> G[NMax];
std::queue<int> coada;
int n,m,flow,x,y,c,fmin;
int F[NMax][NMax],C[NMax][NMax],TT[NMax];
bool viz[NMax];

bool _BF(int x0,int y0)
{
    memset(viz,0,sizeof(viz));
    viz[x0] = 1;
    coada.push(x0);
    int nodx,nody;
    while(!coada.empty())
    {
        nodx = coada.front();
        coada.pop();
        if (nodx == n) continue;
        for(int i=0;i<G[nodx].size();++i)
        {
            nody = G[nodx][i];
            if(C[nodx][nody]==F[nodx][nody]||viz[nody])continue;
            viz[nody] = 1;
            coada.push(nody);
            TT[nody] = nodx;
        }
    }
    return viz[y0];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&c);
        C[x][y] += c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int nodx,nody;
    while(_BF(1,n))
    {
        for (int i=0;i<G[n].size();++i)
        {
            nodx = G[n][i];
            if(C[nodx][n]==F[nodx][n]||!viz[nodx])continue;
            TT[n] = nodx;

            fmin = INF;
            for(nodx=n;nodx!=1;nodx=TT[nodx])
            {
                fmin = min(fmin,C[TT[nodx]][nodx] - F[TT[nodx]][nodx]);
            }

            if(fmin == 0)continue;

            for (nodx=n;nodx!=1;nodx=TT[nodx])
            {
                F[TT[nodx]][nodx]+=fmin;
                F[nodx][TT[nodx]]-=fmin;
            }

            flow += fmin;
        }
    }
    printf("%d",flow);
    return 0;
}