Mai intai trebuie sa te autentifici.

Cod sursa(job #1345695)

Utilizator somuBanil Ardej somu Data 17 februarie 2015 20:11:36
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define nmax 1010

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m, S, D, fMax, fMin;
int c[nmax][nmax], f[nmax][nmax], t[nmax];
bool viz[nmax];
vector <int> G[nmax];
queue <int> q;

void read() {
    int x, y;
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        fin >> x >> y >> c[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

bool bfs() {
    for (int i = 0; i <= n; i++) viz[i] = false;
    viz[1] = true;
    q.push(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] = true;
            t[vecin] = nod;
            q.push(vecin);
        }
    }
    return viz[n];
}

void solve() {
    
    for (fMax = 0; bfs(); ) {
        
        for (int i = 0; i < G[n].size(); ++i) {
            
            int vecin = G[n][i];
            
            if (f[vecin][n] == c[vecin][n] || viz[vecin] == false) continue;
            
            t[n] = vecin;
            
            fMin = 0x3f3f;
            
            for (int nod = n; nod != 1; nod = t[nod])
                fMin = min(fMin, c[t[nod]][nod] - f[t[nod]][nod]);
            
            if (fMin == 0) continue;
            
            fMax += fMin;
            
            for (int nod = n; nod != 1; nod = t[nod]) {
                f[t[nod]][nod] += fMin;
            }
            
        }
    
    }
    
    fout << fMax << "\n";
    
}

int main() {
    
    read();
    solve();
    
    fin.close();
    fout.close();
    
    return 0;
}