Cod sursa(job #2004019)

Utilizator infomaxInfomax infomax Data 24 iulie 2017 17:10:40
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

#define inf 0x3f3f3f3f

using namespace std;

FILE *F=fopen("maxflow.in", "r"), *G=fopen("maxflow.out", "w");

int cd[1002], t[1002], c[1002][1002], f[1002][1001], x, y, z, n, m, Fmin;
bitset<1002> viz;
vector<int> a[1002];

int BFS()
{
    int x, y;
    cd[0] = 1;
    cd[1] = 1;
    viz = 0;
    viz[1] = 1;
    for(int i = 1; i <= cd[0]; ++ i)
    {
        x = cd[i];
        for(int j = 0; j < a[x].size(); ++ j)
        {
            y = a[x][j];
            if(c[x][y] == f[x][y] || viz[y]) continue;
            viz[y] = 1;
            cd[++cd[0]] = y;
            t[y] = x;
            if(y == n) return 1;
        }
    }
    return 0;
}

int main()
{
    int flow;
    fscanf(F, "%d %d ", &n, &m);
    for(int i = 0; i < m; ++ i)
    {
        fscanf(F, "%d %d %d", &x, &y, &z);
        c[x][y] = z;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    for(flow = 0; BFS(); flow += Fmin)
    {
        Fmin = inf;
        for(int i = n; i > 1; i = t[i]) Fmin = min(Fmin, c[t[i]][i] - f[t[i]][i]);
        if(!Fmin) continue;
        for(int i = n; i > 1; i = t[i])
            f[t[i]][i] += Fmin, f[i][t[i]] -= Fmin;
    }
    fprintf(G, "%d", flow);
    return 0;
}