Cod sursa(job #1869343)

Utilizator FredyLup Lucia Fredy Data 5 februarie 2017 19:07:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define lim 10010
int n,m,p,x,y,rez;
vector <int> G[lim];
int viz[lim],A[lim],B[lim];


void initializare()
{
    for(int i=1; i<=n+1; i++)
        viz[i]=0;
}


bool pair_up(int nod)
{
    if(viz[nod])    return false;
    viz[nod]=1;

    for(auto it:G[nod])
        if(B[it]==0)
        {
            B[it]=nod;
            A[nod]=it;
            return true;
        }

    for(auto it:G[nod])
        if(pair_up(B[it]))
        {
            B[it]=nod;
            A[nod]=it;
            return true;
        }
    return false;
}


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

    for(; p; p--)
    {
        fin>>x>>y;
        G[x].push_back(y);
    }

    bool ok=1;
    while(ok)
    {
        initializare();
        ok=0;
        for(int i=1; i<=n; i++)
            if(A[i]==0)
                if(pair_up(i))
                    ok=true;
    }

    for(int i=1; i<=n; i++)
        if(A[i])    rez++;
    fout<<rez<<'\n';
    for(int i=1; i<=n; i++)
        if(A[i])    fout<<i<<' '<<A[i]<<'\n';

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