Cod sursa(job #1645976)

Utilizator gapdanPopescu George gapdan Data 10 martie 2016 14:34:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 1e10

using namespace std;

int n,m,i,j,k,x,y,c,sol,nod,flmin;
int flux[NMAX][NMAX],cap[NMAX][NMAX];
int tata[NMAX],viz[NMAX];
queue<int>q;
vector<int>v[NMAX];

void BFS(int nod)
{
    q.push(nod);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        if(x == n) continue;
        for(int i=0; i < v[x].size();++i)
        {
            int fiu=v[x][i];
            if(cap[x][fiu] == flux[x][fiu] || viz[fiu] == k) continue;
            viz[fiu]=k;
            q.push(fiu);
            tata[fiu]=x;
        }
    }
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]=c;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    sol=0;
    while(true)
    {
        ++k;
        BFS(1);
        if(viz[n] <k) break;
        for(i=0;i<v[n].size();++i)
        {
            int fiu=v[n][i];
            if(flux[fiu][n] == cap[fiu][n] || viz[fiu] < k) continue;
            tata[n]=fiu;
            nod=n;flmin=INF;
            while(nod != 1)
            {
                flmin=min(flmin,cap[tata[nod]][nod]-flux[tata[nod]][nod]);
                nod=tata[nod];
            }
            //pompam flux
            nod=n;
            while(nod != 1)
            {
                flux[tata[nod]][nod] += flmin;
                flux[nod][tata[nod]] -= flmin;
                nod=tata[nod];
            }
            sol+=flmin;
        }
    }
    printf("%d\n",sol);
    return 0;
}