Cod sursa(job #2881823)

Utilizator etienAndrone Stefan etien Data 30 martie 2022 21:54:22
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int>a[10001],b[10001];
bool cuplat[10001];
int pereche[10001];
bool viz[10001];
int cup_init(int x)
{
    for(auto q:a[x])
        if(!pereche[q])
            return q;
    return 0;
}
bool incearca(int x)
{
    if(viz[x])
        return false;
    viz[x]=true;
    for(auto q:a[x])
    {
        if(!cuplat[q]||incearca(pereche[q]))
        {
            cuplat[x]=true;
            pereche[q]=x;
            return true;
        }
    }
    return false;
}
int main()
{
    int n,m,e;
    fin>>n>>m>>e;
    for(i=1;i<=e;i++)
    {
        int x,y;
        fin>>x>>y;
        a[x].push_back(y);
        b[y].push_back(x);
    }
    for(i=1;i<=n;i++)
    {
        int x=cup_init(i);
        if(x!=0)
        {
            pereche[x]=i;
            cuplat[i]=true;
        }
    }
    int l=0;
    bool imbunatatit=true;
    do
    {
        imbunatatit=false;
        fill(viz,viz+m+1,0);
        for(int i=1;i<=m;i++)
            if(!cuplat[i])
            {
                cuplat[i]=incearca(i);
                imbunatatit=true;
            }
    }
    while(imbunatatit);
    for(i=1;i<=n;i++)
        if(cuplat[i])
            l++;
    fout<<l<<"\n";
    for(i=1;i<=n;i++)
        if(cuplat[i])
            fout<<pereche[i]<<" "<<i<<"\n";
	return 0;

}