Cod sursa(job #2712108)

Utilizator OvidRata Ovidiu Ovid Data 25 februarie 2021 10:36:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
//#define int ll

int t, n, m,E, k, a[300010], q, l, r;

vector<int> g[40010];
int c[200101][3];
int f[200010][3];


bool v[40010];
pii p[40010];
int fat[40010];

int cuplu[100010];


//graful e gata, a ramas doar augmentarea prin nivelele bfs-ului si traversarea in adancime, corespunzatoare lui Hopkroft-Karp



bool dfs(int s){
    if(v[s]){
        return false;
    }
    v[s]=true;
    for(int u:g[s]){
        if(cuplu[u]==0){
            cuplu[u]=s; cuplu[s]=u;
            return true;
        }
    }

    for(int u:g[s]){
        if(cuplu[u]!=0){
            if(dfs(cuplu[u])){
                cuplu[s]=u; cuplu[u]=s;
                return true;
            }
        }
    }
    return false;
}





pii pr[100010];

int32_t main(){
INIT

freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);

cin>>n>>m>>E;


for(int i=1; i<=E; i++){
    int u, v;
    cin>>u>>v;
    g[u].pb(v+n);
    g[v+n].pb(u);
}




while(true){
    for(int i=1; i<=n; i++){
        v[i]=false;
    }
    bool b=false;
    for(int i=1;i<=n; i++){
        if(cuplu[i]==0){
            b|=dfs(i);
        }
    }
    if(!b){break;}
}

int res=0;

for(int i=1; i<=n; i++){
    if(cuplu[i]!=0){
        res++;
    }
}

cout<<res<<"\n";

for(int i=1; i<=n; i++){
    if(cuplu[i]!=0){
        cout<<i<<" "<<(cuplu[i]-n)<<"\n";
    }
}


return 0;
}