Cod sursa(job #2833082)

Utilizator DordeDorde Matei Dorde Data 14 ianuarie 2022 18:07:23
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int const N = 2e4 + 3;
int n , m , e , a , b;
vector<int> v[N];
map<pair<int , int> , int> f;
queue<int> q;
int lv[N] , t[N];
bool bfs(){
    q.push(0);
    lv[0] = 1;
    while(!q.empty()){
        auto x = q.front();
        q.pop();
        for(auto y : v[x]){
            if(lv[y] || f[make_pair(x , y)] <= 0)
                continue;
            lv[y] = 1 + lv[x];
            q.push(y);
        }
    }
    return lv[m + 1] > 0;
}
int dfs(int x , int r){
    if(x == m + 1)
        return r;
    for(auto y : v[x]){
        auto z = f[make_pair(x , y)];
        if(lv[x] + 1 != lv[y] || z <= 0)
            continue;
        int flow = dfs(y , min(r , z));
        if(flow > 0){
            f[make_pair(x , y)] -= flow;
            t[y] = x;
            f[make_pair(y , x)] += flow;
            return flow;
        }
        lv[y] = 2e9;
    }
    return 0;
}
int maxflow(){
    int r = 0 , flow;
    while(true){
        fill(lv , lv + 2 + m , 0);
        if(!bfs()){
            break;
        }
        do{
            flow = dfs(0 , 2e9);
            r += flow;
        }while(flow);
    }
    return r;
}
int main()
{
    fin >> n >> m >> e , m += n;
    for(int i = 1 ; i <= e ; ++ i){
        fin >> a >> b , b += n;
        v[a].push_back(b);
        v[b].push_back(a);
        v[0].push_back(a);
        v[a].push_back(0);
        v[b].push_back(m + 1);
        v[m + 1].push_back(b);
        f[make_pair(a , b)] = 1;
        f[make_pair(b , a)] = 0;
        f[make_pair(0 , a)] = 1;
        f[make_pair(a , 0)] = 0;
        f[make_pair(b , m + 1)] = 1;
        f[make_pair(m + 1 , b)] = 0;
    }
    fout << maxflow() << '\n';
    for(int i = n + 1 ; i <= m ; ++ i)
        if(t[i])
            fout << t[i] << ' ' << i - n << '\n';
    return 0;
}