Cod sursa(job #2850432)

Utilizator lucriLuchian Cristian lucri Data 16 februarie 2022 19:19:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n1,n2,m,x,y,link[100010],viz[100010],vizn;
vector<vector<int>>a;
void leaga(int a,int b)
{
    link[link[a]]=link[link[b]]=0;
    link[b]=a;
    link[a]=b;
    return;
}
int cautaredrum(int nod)
{
    viz[nod]=vizn;
    for(auto x:a[nod])
    {
        if(viz[link[x]]==vizn||x==link[nod])
            continue;
        if(link[x]!=0)
        {
            int z=cautaredrum(link[x]);
            if(z)
            {
                leaga(nod,x);
                return x;
            }
        }
        else
        {
            leaga(nod,x);
            return x;
        }
    }
    return 0;
}
int main()
{
    in>>n1>>n2>>m;
    a.resize(n1+n2+5);
    while(m--)
    {
        in>>x>>y;
        y+=n1;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    bool ver=true;
    while(ver)
    {
        ++vizn;
        ver=false;
        for(int i=1;i<=n1;++i)
        {
            if(link[i]==0&&viz[i]<vizn)
            {
                int b=cautaredrum(i);
                if(b)
                    ver=true;
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n1;++i)
        if(link[i])
            ++ans;
    out<<ans<<'\n';
    for(int i=1;i<=n1;++i)
        if(link[i])
            out<<i<<' '<<link[i]-n1<<'\n';
    return 0;
}