Cod sursa(job #1966900)

Utilizator mariakKapros Maria mariak Data 15 aprilie 2017 17:32:14
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define maxN 1002
#define inf 0x7fffffff

FILE *fin  = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);

using namespace std;
/*---------Input data-------*/
int N, M, S, D;
vector <int> G[maxN];
/*---------Flow data--------*/
int flow, r[maxN][maxN], dad[maxN];
queue <int> q;

bool bfs(){
    for(int i = 1; i <= N; ++ i)
        dad[i] = 0;
    dad[1] = 1;
    q.push(S);
    while(q.size()){
        int node = q.front();
        q.pop();
        for(int son : G[node]){
            if(dad[son] || r[node][son] == 0) continue;
            dad[son] = node;
            if(son != D)
                q.push(son);
        }
    }
    return dad[D] != 0;
}

void Flow(){
    while(bfs()){
        for(int node : G[D])
            if(dad[node]){
                dad[D] = node;
                int pathFlow = inf;
                node = D;
                while(node != S){
                    pathFlow = min(pathFlow, r[dad[node]][node]);
                    node = dad[node];
                }
                node = D;
                while(node != S){
                    r[dad[node]][node] -= pathFlow;
                    r[node][dad[node]] += pathFlow;
                    node = dad[node];
                }
                flow += pathFlow;
            }
    }
}

int main(){
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= M; ++ i){
        int x, y, c;
        scanf("%d %d %d", &x, &y, &c);
        G[x].push_back(y);
        G[y].push_back(x);
        r[x][y] = c;
    }
    S = 1, D = N;
    Flow();
    printf("%d\n", flow);
    return 0;
}