Cod sursa(job #2870865)

Utilizator dianannnDiana Novac dianannn Data 12 martie 2022 17:11:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f ("cuplaj.in");
ofstream g ("cuplaj.out");
#define maxn 10005
#define fori(i,a) for(vector<int>::iterator i=(a).begin();i!=(a).end();++i)
vector<int>a[maxn];
int l[maxn],r[maxn],u[maxn];
int pairup(const int n)
    {
        if(u[n])
            return 0;
        u[n]=1;
        fori(i,a[n])
             if(!r[*i])
        {
            l[n]=*i;
            r[*i]=n;
            return 1;
        }
        fori(i,a[n])
             if(pairup(r[*i]))
                {
                  l[n]=*i;
                  r[*i]=n;
                  return 1;
                }
        return 0;
    }

int main()
{
    int n,m,e;
    f>>n>>m>>e;
    for(;e;e--)
    {
        int x,y;
        f>>x>>y;
        a[x].push_back(y);
    }
    for(int change=1;change;)
    {
        change=0;
        memset(u,0,sizeof(u));
        for(int i=1;i<=n;i++)
            if (!l[i])
                change|=pairup(i);
    }
    int cuplaj=0;
    for(int i=1;i<=n;i++)
        cuplaj+=(l[i]>0);
    g<<cuplaj<<'\n';
    for(int i=1;i<=n;i++)
        if(l[i]>0)
        g<<i<<" "<<l[i]<<'\n';
    return 0;
}