Cod sursa(job #2868366)

Utilizator RTG123Razvan Diaconescu RTG123 Data 10 martie 2022 21:25:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,l,continued=1,viz[10001],nleft[10001],nright[10001],nr;
vector <vector <int>> v(10001);
int makepairs (int cur)
{
    //cout<<cur<<'\n';
    if (viz[cur]) return 0;
        viz[cur]=1;
        //continued=1;
        for (int j=0; j<v[cur].size(); j++)
        {
            int next=v[cur][j];
            if (!nright[next])
            {
                nleft[cur]=next;
                nright[next]=cur;
                return 1;
                //makepairs(next,counter+1);
            }
        }
        for (int j=0; j<v[cur].size(); j++)
        {
            int next=v[cur][j];
            if (makepairs(nright[next]))
            {
                nleft[cur]=next;
                nright[next]=cur;
                return 1;
            }
        }
        return 0;
}
int main()
{
    f>>n>>m>>l;
    for (int i=1; i<=l; i++)
    {
        int x,y;
        f>>x>>y;
        v[x].push_back(y);
    }
    while (continued)
    {
        continued=0;
        memset(viz,0,sizeof(viz));
        for (int i=1; i<=n; i++)
        {
            if (!nleft[i])
            continued=continued | makepairs(i);
        }
    }
    for (int i=1; i<=n; i++)
    {
        if (nleft[i]!=0)
        {
            nr++;
        }
    }
    g<<nr<<'\n';
    for (int i=1; i<=n; i++)
    {
        if (nleft[i]!=0)
        {
            g<<i<<' '<<nleft[i]<<'\n';
        }
    }
    return 0;
}