Cod sursa(job #2818689)

Utilizator puica2018Puica Andrei puica2018 Data 16 decembrie 2021 18:15:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;

/**
Cuplax maxim in graf bipartit
*/
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
vector<int> L[10002]; /// listele de adiacenta
bitset<10002> viz; /// viz[i]=1 daca i este deja cuplat
int st[10002], dr[10002], ans;
/// (k,i) - muchie in cuplaj => st[k]=i, dr[i]=k
void Citire()
{
    int i, j;
    fin >> N >> M >> E;
    for (int k = 1; k <= E; k++)
    {
        fin >> i >> j;
        L[i].push_back(j);
    }
}

bool Cupleaza(int k)
{
    if (viz[k] == 1) return false;
    viz[k] = 1;
    for (int i : L[k])
        if (dr[i] == 0) /// am gasit un adiacent necuplat
        {
            /// cuplam nodurile (k, i)
            st[k] = i;
            dr[i] = k;
            return true;
        }
     for (int i : L[k])
        if (Cupleaza(dr[i]))
         {
             st[k] = i;
             dr[i] = k;
             return true;
         }
    return false;
}

void CuplajMax()
{
    int i, gata = 0;
    while (gata == 0)
    {
        gata = 1;
        viz.reset();
        for (i = 1; i <= N; i++)
            if (st[i] == 0 && Cupleaza(i))
            {
                ans++;
                gata = 0;
            }
    }
}

void Afis()
{
    fout << ans << "\n";
    for (int i = 1; i <= N; i++)
        if (st[i] > 0)
            fout << i << " " << st[i] << "\n";
}

int main()
{
    Citire();
    CuplajMax();
    Afis();
    fin.close();
    fout.close();
    return 0;
}