Cod sursa(job #2249344)

Utilizator 12222Fendt 1000 Vario 12222 Data 29 septembrie 2018 16:17:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int Nmax=1e4+2;

int n,m,e;
int st[Nmax],dr[Nmax];
bitset<Nmax>viz;
vector<int>L[Nmax];

inline bool Cuplaj(int nod)
{
    if(viz[nod])
        return 0;

    viz[nod]=1;
    for(auto i:L[nod])
        if(!dr[i])
        {
            st[nod]=i;
            dr[i]=nod;
            return 1;
        }

    for(auto i:L[nod])
        if(Cuplaj(dr[i]))
        {
            st[nod]=i;
            dr[i]=nod;
            return 1;
        }

    return 0;
}

int main()
{
    fin>>n>>m>>e;

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

    int ok=1,sol=0;

    while(ok)
    {
        ok=0;
        viz.reset();

        for(int i=1;i<=n;i++)
            if(!st[i] && Cuplaj(i))
            {
                sol++;
                ok=1;
            }
    }

    fout<<sol<<"\n";

    for(int i=1;i<=n;i++)
        if(st[i])
            fout<<i<<" "<<st[i]<<"\n";

    fin.close();
    fout.close();
    return 0;
}