Cod sursa(job #2649995)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 17 septembrie 2020 00:43:26
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<int> g[1005];
int n, m;
vector<pair<int, pair<long long, long long>>> edges;
int prev_edge[1005];
int from[1005];

void bfs()
{
    queue<int> q;

    q.push(1);
    for(int i = 1; i <= n; i++) { prev_edge[i] = -1; from[i] = 0; }

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

        for(int i = 0; i < g[node].size(); i++)
        {
            auto edge = edges[g[node][i]];
            if(prev_edge[edge.first] == -1 && edge.first != 1 && edge.second.first < edge.second.second)
            {
                prev_edge[edge.first] = g[node][i];
                from[edge.first] = node;
                q.push(edge.first);
            }
        }

        if(from[n] != 0) return;
    }
}

long long EdmondsKarp()
{
    long long flow = 0;
    do
    {
        bfs();

        if(prev_edge[n] != -1)
        {
            long long df = (long long)(1e18);

            for(int index = n; index != 0; index = from[index])
            {
                int edge_index = prev_edge[index];
                if(edge_index != -1)
                    df = min(df, edges[edge_index].second.second - edges[edge_index].second.first);
            }

            for(int index = n; index != 0; index = from[index])
            {
                int edge_index = prev_edge[index];
                if(edge_index != -1)
                {
                    edges[edge_index].second.first += df;
                    edges[edge_index ^ 1].second.first = edges[edge_index ^ 1].second.first - df;
                }
            }
            flow += df;
        }


    } while(prev_edge[n] != -1);

    return flow;
}

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

    for(int i = 0; i < m; i++)
    {
        int x, y; long long cap; in >> x >> y >> cap;

        g[x].push_back(edges.size());
        g[y].push_back(edges.size() + 1);

        edges.push_back(make_pair(y, make_pair(0, cap)));
        edges.push_back(make_pair(x, make_pair(0, 0LL)));
    }

    out << EdmondsKarp();
}