Cod sursa(job #2815237)

Utilizator ElizaTElla Rose ElizaT Data 9 decembrie 2021 12:39:28
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e3,INF = 2e9;
int padre[NMAX + 5],viz[NMAX + 5];
struct Edge {
    int from,to,cap,flow,next;
}e;
vector <Edge> edges;
vector <int> start(NMAX + 5);
int ans;
queue <int> q;

void init(int n) {
    for (int i = 1;i <= n;i++) {
        viz[i] = 0;
        padre[i] = -1;
    }
}
bool bfs(int src, int dest) {
    int node = src;
    q.push(node);
    viz[node] = 1;
    while (!q.empty()) {
        node = q.front();
        q.pop();
        for (int it = start[node];it != -1;it = edges[it].next) {
            if (!viz[edges[it].to] && edges[it].cap > edges[it].flow) {
                viz[edges[it].to] = 1;
                padre[edges[it].to] = it;
                q.push(edges[it].to);
            }
        }
    }
    return viz[dest];
}
int fill_flow(int src, int node, int mn = INF) {
    if (node == src)
        return mn;
    int flow = fill_flow(src, edges[padre[node]].from, min(mn, edges[padre[node]].cap - edges[padre[node]].flow));
    edges[padre[node]].flow += flow;
    edges[padre[node] ^ 1].flow -= flow;
    return flow;
}
void push_flow(int src, int dest) {
    for (int it = start[dest];it != -1;it = edges[it].next) {
        if (edges[it ^ 1].cap - edges[it ^ 1].flow > 0 && viz[edges[it ^ 1].from]) {
            padre[dest] = it ^ 1;
            ans += fill_flow(src, dest);
        }
    }
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int n,m,u,v,c,src,dest;
    fin >> n >> m;
    src = 1;
    dest = n;
    for (int i = 1;i <= n;i++) {
        padre[i] = -1;
        start[i] = -1;
    }
    for (int i = 0;i < m;i++) {
        fin >> u >> v >> c;
        e.from = u;
        e.to = v;
        e.cap = c;
        e.flow = 0;
        e.next = start[u];
        edges.push_back(e);
        start[u] = edges.size() - 1;
        e.from = v;
        e.to = u;
        e.cap = 0;
        e.flow = 0;
        e.next = start[v];
        edges.push_back(e);
        start[v] = edges.size() - 1;
    }
//    for (int i = 0;i < edges.size();i++) {
//        fout << edges[i].from << " " << edges[i].to << " " << edges[i].cap << " " << edges[i].flow << " " << edges[i].next << '\n';
//    }
//    for (int i = 1;i <= n;i++)
//        fout << start[i] << '\n';
    while (bfs(src, dest)) {
        push_flow(src, dest);
        init(n);
    }
    fout << ans;
    return 0;
}