Cod sursa(job #1810077)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 noiembrie 2016 16:28:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>
#define NMAX 1010
#define INF (1<<30)
using namespace std;

vector<int> G[NMAX];
bool viz[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], T[NMAX];
int N, M, a, b, c, i, fmin, fmax;


int bfs(int start, int end) {
    queue<int> Q;
    Q.push(start);
    
    memset(viz, false, sizeof(viz));
    viz[start] = true;
    
    int n = 0;
    while (!Q.empty()) {
        n = Q.front();
        Q.pop();
        if (n == end) {
            continue;
        }
        
        for (vector<int>::iterator it = G[n].begin(); it != G[n].end(); it++) {
            if (!viz[*it] && C[n][*it] > F[n][*it]) {
                viz[*it] = true;
                T[*it] = n;
                Q.push(*it);
            }
        }
    }
    
    return viz[end];
}


int main(int argc, char **argv)
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    
    scanf("%d %d", &N, &M);
    for (i = 1; i <= M; i++) {
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b] = c;
    }
    
    while(bfs(1, N)) {
        for (vector<int>::iterator it = G[N].begin(); it != G[N].end(); it++) {
            if (viz[*it] && C[*it][N] > F[*it][N]) {
                T[N] = *it;
                fmin = INF;
                
                for (int n = N; n != 1; n = T[n]) {
                    fmin = min(fmin, C[T[n]][n] - F[T[n]][n]);
                }
                
                fmax += fmin;
                for (int n = N; n != 1; n = T[n]) {
                    F[T[n]][n] += fmin;
                    F[n][T[n]] -= fmin;
                }
            }
        }
    }
    
    printf("%d\n", fmax);
    return 0;
}