Cod sursa(job #2174766)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 16 martie 2018 13:22:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int> G[1005];
bool Use[1005];
int C[1005][1005], F[1005][1005], N, M, TT[1005];
queue <int> Q;
void Read()
{
    f >> N >> M;
    for(int i = 1; i <= M; i++)
    {
        int x, y, c;
        f >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] += c;
    }
}

bool BFS()
{
    for(int i = 1; i <= N; i++)
        TT[i] = -1, Use[i] = 0;
    Q.push(1);
    Use[1] = 1;
    while(!Q.empty())
    {
        int node = Q.front();
        Q.pop();
        if(node == N)
            continue;
        for(int i = 0; i < G[node].size(); i++)
        {
            int neighb = G[node][i];
            if(Use[neighb] == 1 || C[node][neighb] - F[node][neighb] == 0)
                continue;
            Use[neighb] = 1;
            TT[neighb] = node;
            Q.push(neighb);
        }
    }
    return Use[N];
}
void maxF()
{
    int MaxFlow = 0;
    while(BFS())
    {
        for(int i = 0; i < G[N].size(); i++)
        {
            int neighb = G[N][i];
            if(Use[neighb] == 0 || C[neighb][N] - F[neighb][N] == 0)
                continue;
            TT[N] = neighb;
            int fmin = 1000000000;
            for(int i = N; i != 1; i = TT[i])
                fmin = min(fmin, C[TT[i]][i] - F[TT[i]][i]);
            MaxFlow += fmin;
            for(int i = N; i != 1; i = TT[i])
            {
                F[TT[i]][i] += fmin;
                F[i][TT[i]] -= fmin;
            }
        }
    }
    g << MaxFlow << "\n";
}
int main()
{
    Read();
    maxF();
    return 0;
}