Cod sursa(job #2485874)

Utilizator BogdanGhGhinea Bogdan BogdanGh Data 2 noiembrie 2019 10:21:16
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int>v[1005];
int n,m,i,j,x,y,T[1005],Q[1005],p,u,C[1005][1005],F[1005][1005],cost;
bool bfs()
{

    for(int i = 1; i <= n; ++i)
        T[i] = -1;
    T[1] = 0;
    Q[1]=1;
    p=u=1;
    while(p<=u){
        int Nod = Q[p];
        p++;
        for(auto i : v[Nod])
            if(T[i] == -1 && C[Nod][i] > F[Nod][i]) {
                T[i] = Nod;
                if(i == n)
                    return 1;
                Q[++u]=i;
            }
    }
    return 0;
}
int MaxFlow() {

    int ans = 0;

    while(bfs())  {
        for(auto i : v[n])
            if(T[i] != -1) {
                int r = C[i][n] - F[i][n];
                int Nod = i, x = 0;
                while(Nod != 1){
                    x = T[Nod];
                    r = min(r, C[x][Nod] - F[x][Nod]);
                    Nod = x;
                }
                ans += r; F[i][n] += r;  F[n][i] -= r;
                Nod = i;
                while(Nod != 1){
                    x = T[Nod];
                    F[x][Nod] += r;
                    F[Nod][x] -= r;
                    Nod = x;
                }
            }
    }

    return ans;
}
int main()
{

    f>>n>>m;

    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cost;
        C[x][y]=cost;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    g<<MaxFlow();
    return 0;
}