Cod sursa(job #1412508)

Utilizator gapdanPopescu George gapdan Data 1 aprilie 2015 12:33:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 1<<30

using namespace std;

int n,m,x,y,z,flux,flmin;
int viz[NMAX],tata[NMAX];
int f[NMAX][NMAX],c[NMAX][NMAX];
queue<int>q;
vector<int>v[NMAX];


void BFS()
{
    memset(viz,0,sizeof(viz));
    q.push(1);
    viz[1]=1;
    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 (c[x][fiu] == f[x][fiu] || viz[fiu] == 1) continue;
            viz[fiu]=1;
            q.push(fiu);
            tata[fiu] = x;
        }
    }
}
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,&z);
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] = z;
    }

    while(true)
    {
        BFS();
        if (viz[n] == 0) break;
        for(int i = 0; i < v[n].size(); ++i)
        {
            int nod = v[n][i];
            if (f[nod][n] == c[nod][n] || (!viz[nod]) ) continue;
            tata[n] = nod;
            flmin = INF;
            nod = n;
            while(nod != 1)
            {
                flmin=min(flmin, c[tata[nod]][nod] - f[tata[nod]][nod]);
                nod = tata[nod];
            }
            nod = n;
            while(nod != 1)
            {
                f[tata[nod]][nod] += flmin;
                f[nod][tata[nod]] -= flmin;
                nod = tata[nod];
            }
            flux += flmin;
        }
    }
    printf("%d\n",flux);
    return 0;
}