Cod sursa(job #3139506)

Utilizator matwudemagogul matwu Data 28 iunie 2023 22:47:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("O3")
#pragma GCC optimize ("O2")
#pragma GCC optimize ("O1")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize ("fast-math")
#define ezurect int T; cin >> T; while(T--){solve();}
const int N = 1e4 + 1, M = 4e5 + 1, mod = 666013;

vector<int> liste[N];
vector<int> r(N), l(N), viz(N);
int n, w, m;
int match(int nod){
    if(viz[nod]) return 0;
    viz[nod] = 1;

    for(auto i : liste[nod]){
        if(!r[i]){
            l[nod] = i;
            r[i] = nod;
            return 1;
        }
    }

    for(auto i : liste[nod]){
        if(match(r[i])){
            l[nod] = i;
            r[i] = nod;
            return 1;
        }
    }
    return 0;
}
int main(){
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin.tie(0)->sync_with_stdio(0);
    fin >> n >> w >> m;
    for(int i = 1, u, v; i <= m; i++){
        fin >> u >> v;
        liste[u].push_back(v);
    }
    int ok = 1;
    while(ok){
        viz.assign(N, 0);
        ok = 0;
        for(int i = 1; i <= n; i++){
            if(!l[i]) ok |= match(i);
        }
    }
    vector<pair<int, int>> sol;
    for(int i = 1; i <= n; i++){
        if(l[i]){
            sol.push_back({i, l[i]});
        }
    }
    fout << sol.size() << '\n';
    for(auto i : sol){
        fout << i.first << " " << i.second << '\n';
    }
}