Cod sursa(job #3203794)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 14 februarie 2024 17:25:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> G[1002];
int t[1002];
int n;
struct edge{
    int u,v,cap,f = 0;
    edge(int _u, int _v, int _cap){
        u = _u;
        v = _v;
        cap = _cap;
    }
};
vector <edge> edges;
vector <int> level;
vector <int> ptr;
queue <int> q;
bool bfs(){
    q.push(1);
    while(!q.empty()){
        int u = q.front();
        for(auto x : G[u]){
            if(edges[x].cap - edges[x].f < 1) continue;
            if(level[edges[x].v] != -1) continue;
            level[edges[x].v] = level[u] + 1;
            q.push(edges[x].v);
        }
        q.pop();
    }
    return level[n] != -1;
}
int dfs(int nod, int ftemp){
    if(!ftemp) return 0;
    if(nod == n) return ftemp;
    for(int &p = ptr[nod]; p < G[nod].size(); p++){
        int id = G[nod][p];
        int x = edges[id].v;
        if(level[nod] + 1 != level[x] || edges[id].cap - edges[id].f < 1) continue;
        int t = dfs(x, min(ftemp, edges[id].cap - edges[id].f));
        if(!t) continue;
        edges[id].f += t;
        edges[id ^ 1].f -= t;
        return t;
    }
    return 0;
}
int dinic(){
    int rez = 0;
    while(1){
        fill(level.begin(), level.end(), -1);
        level[1] = 0;
        if(!bfs()) break;
        fill(ptr.begin(), ptr.end(), 0);
        while(int t = dfs(1, 1e9)) rez += t;
    }
    return rez;
}
int main()
{
    int i,m,u,v,c,id = 0;
    fin >> n >> m;
    for(i = 1; i <= m; i++){
        fin >> u >> v >> c;
        G[u].push_back(id);
        G[v].push_back(id + 1);
        edges.push_back(edge(u,v,c));
        edges.push_back(edge(v,u,0));
        id += 2;
    }
    level.resize(n + 1);
    ptr.resize(n + 1);
    fout << dinic();
    return 0;
}