Cod sursa(job #2736829)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 3 aprilie 2021 23:18:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;
#define SERVER 0
const string nameFile="cuplaj";
ifstream in (nameFile+".in");
ofstream out(nameFile+".out");
typedef pair<int, int> Pii;
#if (SERVER)
    #define in cin
    #define out cout
#endif
const int nmax=2e4;
int n1, n2, m, x, y;
vector <int> muchii[nmax+2];
int couple[nmax+2];
bool viz[nmax+2];
bool pair_up(int nod){ ///se presupune ca s-a cuplat cu un nod de dinainte
    if(viz[nod])
        return false;
    viz[nod]=true;
    for(auto &x:muchii[nod])
        if(couple[x]==0||pair_up(couple[x])){
            couple[x]=nod, couple[nod]=x;
            return true;
        }
    return false;
}
int main()
{
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    in>>n1>>n2>>m;
    for(int i=1; i<=m; i++){
        in>>x>>y;
        muchii[x].push_back(y+n1);
        muchii[y+n1].push_back(x);
    }
    while(true){
        fill(viz+1, viz+n1+1, false);
        bool ok=false;
        for(int i=1; i<=n1; i++)
            if(viz[i]==false&&!couple[i])
                ok|=pair_up(i);
        if(ok==false)
            break;
    }
    int ans=0;
    for(int i=1; i<=n1; i++)
        if(couple[i]!=0)
            ans++;
    out<<ans<<"\n";
    for(int i=1; i<=n1; i++)
        if(couple[i]!=0)
            out<<i<<" "<<couple[i]-n1<<"\n";
    return 0;
}