Cod sursa(job #2479172)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 23 octombrie 2019 14:41:18
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m;

vector<int> G[1001];

int C[1001][1001];
int F[1001][10001];

bool viz[1001];

int tata[1001];

bool BFS()
{
    fill(viz + 1, viz + n + 1, false);

    queue<int> q;

    q.push(1);

    viz[1] = true;

    while(!q.empty())
    {
        int node = q.front();
        q.pop();

        if(node == n) continue;

        for(int next : G[node])
        {
            if(C[node][next] == F[node][next] || viz[next]) continue;

            viz[next] = true;

            tata[next] = node;

            q.push(next);
        }
    }

    return viz[n];
}


int main()
{
    fin >> n >> m;

    int x, y, z;

    for(int i = 1; i <= m; ++i)
    {
        fin >> x >> y >> z;

        G[x].push_back(y);
        G[y].push_back(x);

        C[x][y] = z;
    }

    int maxflow = 0;

    while(BFS())
    {
        for(int node : G[n])
        {
            if(!viz[node] || C[node][n] == F[node][n]) continue;

            tata[n] = node;

            int flow = 2000000000;

            for(int i = n; i != 1; i = tata[i])
                flow = min(flow, C[tata[i]][i] - F[tata[i]][i]);

            if(!flow) continue;

            for(int i = n; i != 1; i = tata[i])
            {
                F[tata[i]][i] += flow;
                F[i][tata[i]] -= flow;
            }

            maxflow += flow;
        }
    }

    fout << maxflow;
}