Cod sursa(job #763415)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 2 iulie 2012 10:47:18
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

const int N = 1010;
vector <int> vec[N];
int n, m, a, b, c, sol, ok = 1;
int capacitate[N][N], f[N][N];
int fol[N], tata[N], flux[N];


void bfs()
{
    int nod;
    queue <int> q;
    memset(fol, 0, sizeof(fol));
    memset(tata, 0, sizeof(tata));
    memset(flux, 0, sizeof(flux));
    flux[1] = 0x3f3f3f3f;
    fol[1] = 1;
    q.push(1);
    while(!q.empty()) {
        nod = q.front();
        q.pop();
        for(vector <int>::iterator it = vec[nod].begin(); it != vec[nod].end(); ++it)
            if(!fol[*it] && capacitate[nod][*it] > 0) {
                fol[*it] = 1;
                flux[*it] = min(flux[nod], capacitate[nod][*it]);
                tata[*it] = nod;
                q.push(*it);
            }
        if(fol[n])
            break;
    }
   /* for(int i = 1; i <= n; ++i)
        printf("%d %d %d %d\n", i, fol[i], flux[i], tata[i]);
    printf("\n");*/
    ok = flux[n];
    if(ok) {
        for(int i = n; i != 1; i = tata[i]) {
            capacitate[tata[i]][i] -= flux[n];
            capacitate[i][tata[i]] += flux[n];
        }
        //fprintf(stderr, "%d ", flux[n]);
    }
    /*for (int i = 1; i <= n; i++)
       for (int j = 1; j <= n; j++)
           if (capacitate[i][j])
               printf("%d %d %d\n", i, j, capacitate[i][j]);
    printf("\n\n");*/
}



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", &a, &b, &c);
        vec[a].push_back(b);
        vec[b].push_back(a);
        capacitate[a][b] += c;
    }
    while(ok) {
        bfs();
        sol += ok;
    }
    printf("%d\n", sol);

    return 0;
}