Cod sursa(job #2589293)

Utilizator trifangrobertRobert Trifan trifangrobert Data 26 martie 2020 02:27:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
//Dinic's algorithm
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>

using namespace std;

const int NMAX = 1005;
const int INF = (1 << 30);
int N, M;
vector <int> graph[NMAX];
int flow[NMAX][NMAX], cap[NMAX][NMAX];
int dist[NMAX], last[NMAX];

bool bfs()
{
    for (int i = 1; i <= N; ++i)
        dist[i] = INF;
    dist[1] = 1;
    queue <int> q;
    q.push(1);
    while (!q.empty())
    {
        int node = q.front();
        q.pop();
        for (auto& x : graph[node])
            if (dist[x] > dist[node] + 1 && flow[node][x] < cap[node][x])
            {
                dist[x] = dist[node] + 1;
                q.push(x);
            }
    }
    return (dist[N] != INF);
}

int dfs(int node, int deltaflow)
{
    if (node == N)
        return deltaflow;
    else
    {
        for (int& p = last[node]; p < graph[node].size(); ++p)
        {
            int nextnode = graph[node][p];
            if (dist[nextnode] == dist[node] + 1 && flow[node][nextnode] < cap[node][nextnode])
            {
                int currflow = dfs(nextnode, min(deltaflow, cap[node][nextnode] - flow[node][nextnode]));
                if (currflow > 0)
                {
                    flow[node][nextnode] += currflow;
                    flow[nextnode][node] -= currflow;
                    return currflow;
                }
            }
        }
        return 0;
    }
}

int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        int u, v, c;
        fin >> u >> v >> c;
        graph[u].push_back(v);
        graph[v].push_back(u);
        cap[u][v] += c;
    }
    int maxflow = 0;
    while (bfs())
    {
        for (int i = 1; i <= N; ++i)
            last[i] = 0;
        int deltaflow = dfs(1, INF);
        while (deltaflow > 0)
        {
            maxflow += deltaflow;
            deltaflow = dfs(1, INF);
        }
    }
    fout << maxflow << "\n";
    fin.close();
    fout.close();
    return 0;
}