Cod sursa(job #1267093)

Utilizator anarogozAna Rogoz anarogoz Data 19 noiembrie 2014 15:06:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int NMAX = 1000;
vector <int> v[NMAX+1];
int c[NMAX+1][NMAX+1], f[NMAX+1][NMAX+1];
bool viz[NMAX+1];
int pred[NMAX+1], n;

bool bfs(int poz)
{
    queue <int> q;
    int i, x;
    q.push(poz);
    memset(viz, 0, sizeof(viz));
    while(!q.empty())
    {
        x = q.front();
        viz[x] = true;
        for(i = 0; i < v[x].size(); i++)
            if(v[x][i]!= n && !viz[v[x][i]] && c[x][v[x][i]] - f[x][v[x][i]] > 0)
            {
                pred[v[x][i]] = x;
                viz[v[x][i]] = true;
                q.push(v[x][i]);

            }
        q.pop();
    }
    return false;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m, x, y, i, val, fmin, poz, maxf = 0, ok = 1;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= m; i++) {
        scanf("%d%d%d", &x, &y, &val);
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] = val;
    }

    while(ok)
    {
        bfs (1);
        ok = 0;
        for(i = 0; i < v[n].size(); i++){
            if(f[v[n][i]][n] == c[v[n][i]][n])
                continue;
            if(viz[v[n][i]]) {
                if (c [v [n][i]][n] - f [v [n][i]][n] > 0)
                    ok = 1;
                pred[n] = v[n][i];
                fmin = (1LL << 31) - 1;
                poz = n;
                while(pred[poz])
                {
                    fmin = min(fmin, c[pred[poz]][poz] - f[pred[poz]][poz]);
                    poz = pred[poz];
                }
                if (fmin == 0)
                    continue;
                poz = n;
                while(pred[poz])
                {
                    f[pred[poz]][poz] += fmin;
                    f[poz][pred[poz]] -= fmin;
                    poz = pred[poz];
                }
                maxf += fmin;
          }
        }
    }
    printf("%d\n", maxf);
    return 0;
}