Cod sursa(job #2920491)

Utilizator OvidRata Ovidiu Ovid Data 24 august 2022 14:44:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include<bits/stdc++.h>
using namespace std;

string numeFisier="cuplaj";
ifstream fin(numeFisier+".in"); ofstream fout(numeFisier+".out");
#define cin fin
#define cout fout

#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 n, m, e;

vector<int> g[20010];

bool v[20010];
int cpl[20010];


bool match(int s){
    if(v[s]){
        return false;
    }
    v[s]=true;

    for(int u:g[s]){
        if(cpl[u]==0){
            cpl[s]=u;
            cpl[u]=s;
            return true;
        }
    }

    for(int u:g[s]){
        if(u==cpl[s]){
            continue;
        }
        if(match(cpl[u] ) ){
            cpl[s]=u;
            cpl[u]=s;
            return true;
        }
    }
    return false;
}



int32_t main(){
INIT
cin>>n>>m>>e;
for(int i=1; i<=e; i++){
    int u, v; cin>>u>>v;
    v+=n;
    g[u].pb(v);
    g[v].pb(u);
}



while(true){
    int res=0;
    for(int i=1; i<=n; i++){
        if(cpl[i]==0){
            res+=(int)match(i);
        }
    }
    for(int i=1; i<=(n+m); i++){
        v[i]=false;
    }
    if(res==0){
        break;
    }
}

int k=0;
for(int i=1; i<=n; i++){
    if(cpl[i]>0){
        k++;
    }
}

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


return 0;
}