Cod sursa(job #2025179)

Utilizator FredyLup Lucia Fredy Data 21 septembrie 2017 23:48:23
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

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

bool pair_up(int x)
{
    if (viz[x]) return false;
    viz[x]=true;

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

int main()
{
    int x, y;
    fin>>n>>m>>mm;
    for (int i=1; i<=mm; i++)
    {
        fin>>x>>y;
        G[x].push_back(y);
    }

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

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


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