Cod sursa(job #2814372)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 7 decembrie 2021 23:22:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int NMAX=10005;

int N, M, E, l[NMAX], r[NMAX];
vector<int> g[NMAX];
bool viz[NMAX];

int pairup(int nod)
{
    if(viz[nod]==true)
        return 0;
    viz[nod]=true;

    for(auto x: g[nod]){
        if(r[x]==0){
            l[nod]=x;
            r[x]=nod;
            return 1;
        }
    }
    for(auto x: g[nod]){
        if(pairup(r[x])){
            l[nod]=x;
            r[x]=nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    fin>>N>>M>>E;

    while(E--){
        int x, y;
        fin>>x>>y;
        g[x].push_back(y);
    }

    bool ok=true;
    while(ok==true){
        ok=false;
        for(int i=1;i<=N;i++)
            viz[i]=false;
        for(int i=1;i<=N;i++){
            if(l[i]==0){
                if(pairup(i))
                    ok=true;
            }
        }
    }

    int sol=0;
    for(int i=1;i<=N;i++)
        sol+=l[i]!=0;

    fout<<sol<<'\n';
    for(int i=1;i<=N;i++)
        if(l[i]!=0)
            fout<<i<<' '<<l[i]<<'\n';

    return 0;
}