Cod sursa(job #2819102)

Utilizator rimihaiMihai Radu-Ioan rimihai Data 17 decembrie 2021 20:41:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 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];
bool vector_vizitat[nrnoduri];
int st[nrnoduri], dr[nrnoduri], cupmax;


bool cuplaj(int k)
{
    if (vector_vizitat[k]==1) return false;
    vector_vizitat[k]=1;
    for (int i:lista_adiacenta[k])
        if (dr[i] == 0)
        {
            st[k] = i;
            dr[i] = k;
            return true;
        }
    for (int i : lista_adiacenta[k])
        if (cuplaj(dr[i]))
        {
            st[k] = i;
            dr[i] = k;
            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;
        memset(vector_vizitat, 0, sizeof(vector_vizitat));
        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;
}