Cod sursa(job #3338177)

Utilizator vladsoartavlad sofronea vladsoarta Data 1 februarie 2026 11:09:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

int cuplat[100001],viz[100001],cnt,e,n,m;
vector<int>g[100001];

void cuplare(int a,int b)
{

    cuplat[cuplat[a]] = 0;
    cuplat[a] = b;
    cuplat[cuplat[b]] = 0;
    cuplat[b] = a;
}

bool dfs(int nod)
{
    viz[nod] = cnt;
    for(auto vecin:g[nod])
        if(viz[vecin]!=cnt)
        {
            viz[vecin] = cnt;
            if(!cuplat[vecin])
            {
                cuplare(nod,vecin);
                return 1;
            }
            if(cuplat[vecin] && dfs(cuplat[vecin]) == 1)
            {
                cuplare(nod,vecin);
                return 1;
            }
        }
    return 0;

}

int main()
{

    cin>>n>>m>>e;

    for(int i=1; i<=e; i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].push_back(n+b);
        g[n+b].push_back(a);
    }


    bool ok=1;
    while(ok)
    {
        ok=0;
        cnt++;
        for(int i=1; i<=m+n; i++)
        {
            if(!cuplat[i] && viz[i] != cnt)
                ok = ok | dfs(i);
        }
    }

    int nr = 0;
    for(int i=1; i<=n; i++)
        if(cuplat[i]!=0)
            nr++;
    cout<<nr<<'\n';

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

    return 0;
}