Cod sursa(job #2207599)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 26 mai 2018 02:10:12
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <limits.h>

#define NMAX 1010
using namespace std;

int G[NMAX][NMAX], rG[NMAX][NMAX];
int N, M;

bool bfs(int s, int t, int parent[]) {
    int visited[NMAX];

    memset(visited, 0, sizeof(visited));

    queue<int> Q;
    parent[s] = -1;
    visited[s] = 1;
    Q.push(s);

    while(!Q.empty()) {
        int nod = Q.front();
        Q.pop();

        for(int i=1;i <= N; i++)
        if(visited[i] == 0 && rG[nod][i] > 0) {
            visited[i] = 1;
            Q.push(i);
            parent[i] = nod;
        }
    }

    return (visited[t] == true);
}

int maxFlow(int s, int t) {
    int i, j;
    for(i = 1; i<= N; i++)
        for(j=1; j <= N;j++)
            rG[i][j] = G[i][j];

    int parent[NMAX], maxflow = 0;

    while(bfs(s, t, parent)) {

        int pathflow = INT_MAX;
        for(i = t; i != s; i = parent[i]) {
            j = parent[i];
            pathflow = min(pathflow, rG[j][i]);
        }

        for(i = t; i != s; i = parent[i]) {
            int j = parent[i];
            rG[j][i] -= pathflow;
            rG[i][j] += pathflow;
        }

        maxflow += pathflow;
    }

    return maxflow;
}

int main()
{
    int a, b, cap;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    cin>>N>>M;
    for(int i=0;i < M;i++) {
        cin>>a>>b>>cap;
        G[a][b] = cap;
    }

    cout<<maxFlow(1, N);
}