Cod sursa(job #2819098)

Utilizator rimihaiMihai Radu-Ioan rimihai Data 17 decembrie 2021 20:30:05
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

#define nrnoduri 10005

int n1, n2, m;
vector<int> lista_adiacenta[nrnoduri];
unordered_map<int,bool> vector_vizitat;
int st[nrnoduri], dr[nrnoduri], cupmax;


bool cuplaj(int k)
{
    if (vector_vizitat[k] == 1)
        return false;
    vector_vizitat[k]=1;
    for (int i=0; i<lista_adiacenta[k].size(); i++)
        if (dr[lista_adiacenta[k][i]]==0 or cuplaj(lista_adiacenta[k][i])==true)
        {

            st[k] = lista_adiacenta[k][i];
            dr[lista_adiacenta[k][i]] = k;
            //cout<<"st: "<<st[k]<<" "<<"dr: "<<dr[lista_adiacenta[k][i]]<<endl;
            return true;
        }
    return false;
}

int main()
{
    fin>>n1>>n2>>m;
    for (int i=1; i<=m; i++)
    {
        int a,b;
        fin>>a>>b;
        lista_adiacenta[a].push_back(b);
    }
    bool ok=1;
    while(ok)
    {
        ok=0;
        vector_vizitat.clear();
        for (int i=1; i<=n1; i++)
            if(st[i]==0 and cuplaj(i)==true)
            {
                cupmax++;
                ok=1;
            }
    }
    fout<<cupmax<<"\n";
    for(int i=1; i<=n1; i++)
        if(st[i]!=0)
            fout<<i<<" "<<st[i]<<'\n';
    return 0;
}