Cod sursa(job #1369097)

Utilizator somuBanil Ardej somu Data 2 martie 2015 21:46:12
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define nmax 1005
#define inf 1<<30

using namespace std;

int n, m, maxFlow;
int c[nmax][nmax], f[nmax][nmax], tata[nmax];

bool viz[nmax];

vector <int> G[nmax];
queue <int> q;

bool bfs() {
    
    memset(viz, 0, sizeof(viz));
    
    q.push(1);
    viz[1] = 1;
    
    while (!q.empty()) {
        
        int nod = q.front();
        q.pop();
        
        if (nod == n)
            continue;
        
        for (int i = 0; i < G[nod].size(); i++) {
            int vecin = G[nod][i];
            
            if (viz[vecin] || c[nod][vecin] == f[nod][vecin])
                continue;
            
            viz[vecin] = 1;
            tata[vecin] = nod;
            q.push(vecin);
            
        }
        
    }
    
    return viz[n];
}

int main() {
    
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        fin >> x >> y >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y] = z;
    }
    
    while (bfs()) {
        
        for (int i = 0; i < G[n].size(); i++) {
            
            int vecin = G[n][i];
            
            if (!viz[vecin] || c[vecin][n] == f[vecin][n])
                continue;
            
            tata[n] = vecin;

            int fMin = inf;

            for (int nod = n; nod != 1; nod = tata[nod])
                fMin = min(fMin, c[tata[nod]][nod] - f[tata[nod]][nod]);
            
            if (fMin == 0)
                continue;
            
            maxFlow += fMin;
            
            for (int nod = n; nod != 1; nod = tata[nod]) {
                f[tata[nod]][nod] += fMin;
                f[nod][tata[nod]] -= fMin;
            }
            
        }
        
    }
    
    fout << maxFlow << "\n";
    
    fin.close();
    fout.close();
    
    return 0;
}