Cod sursa(job #2949021)

Utilizator OvidRata Ovidiu Ovid Data 29 noiembrie 2022 13:16:03
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;

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;
}


int GetMaxMatching(vector<int> g[], int cpl[], bool v[], int n, int m){

    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++;
        }
    }

    return k;
}





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);
    }



   int k = GetMaxMatching(g, cpl, v, n, m);

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


    return 0;
}