Cod sursa(job #3265080)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 26 decembrie 2024 23:11:09
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define ff first
#define ss second
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define FORR(i, a, b) for(int i = a; i >= b; --i)
#define vi vector<int>
#define vvi vector<vi>
#define pb push_back
using namespace std;
const string TASK("maxflow");
ifstream fin(TASK + ".in");
ofstream fout(TASK + ".out");
#define cin fin
#define cout fout

const int N = 1e3 + 9, LG = 20;

int n, m;
vvi G(N);

struct edge
{
    int from, to, cap, flow;

    edge(int from = 0, int to = 0, int cap = 0) : from(from), to(to), cap(cap), flow(0) {}
};

vector<edge> edges;

void add_edge(int x, int y, int c)
{
    G[x].pb(edges.size());
    edges.pb({x, y, c});
    G[y].pb(edges.size());
    edges.pb({y, x, 0});
}

bitset<N> v;
queue<int> q;
int t[N];
bool Bfs()
{
    v.reset();
    q.push(1);
    v[1] = true;
    while(!q.empty())
    {
        int x = q.front();
        q.pop();

        for(auto id : G[x])
        {
            auto e = edges[id];
            if(e.flow < e.cap && !v[e.to])
            {
                q.push(e.to);
                t[e.to] = id;
                v[e.to] = true;
            }
        }
    }

    return v[n];
}

int Augment()
{
    int ret = INT_MAX;
    for(int x = n; x != 1; x = edges[t[x]].from)
        ret = min(ret, edges[t[x]].cap - edges[t[x]].flow);

    for(int x = n; x != 1; x = edges[t[x]].from)
    {
        edges[t[x]].flow += ret;
        edges[t[x] ^ 1].flow -= ret;
    }

    return ret;
}

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

    int x, y, c;
    FOR(i, 1, m)
    {
        cin >> x >> y >> c;
        add_edge(x, y, c);
    }


    int max_flow = 0;
    for(; Bfs(); max_flow += Augment());

    cout << max_flow << '\n';
    return 0;
}