Cod sursa(job #1995461)

Utilizator FredyLup Lucia Fredy Data 28 iunie 2017 00:41:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define lim 10010
int n,m,e,rez;
int A[lim],B[lim];
vector <int> G[lim];
bool viz[lim],ok;

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


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

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

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

    return false;
}


int main()
{
    int x,y;
    fin>>n>>m>>e;

    for(int i=1; i<=e; i++)
    {
        fin>>x>>y;
        G[x].push_back(y);
    }


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

    rez=0;
    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;
}