Cod sursa(job #1089588)

Utilizator sebinechitasebi nechita sebinechita Data 21 ianuarie 2014 19:46:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define MAX 10005
vector <int> G[MAX];
int l[MAX], r[MAX], viz[MAX];


bool pair_up(int nod)
{
    int i, g;
    if(viz[nod])
        return 0;
    viz[nod]=1;
    for(i=0;i<G[nod].size();i++)
    {
        g=G[nod][i];
        if(!l[g])
        {
            l[g]=nod;
            r[nod]=g;
            return 1;
        }
    }
    for(i=0;i<G[nod].size();i++)
    {
        g=G[nod][i];
        if(pair_up(l[g]))
        {
            l[g]=nod;
            r[nod]=g;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int m, i, j, ok, e, x, y;
    int n;
    fin>>n;
    fin>>m;
    fin>>e;
    while(e--)
    {
        fin>>x>>y;
        G[x].push_back(y);

    }
    do{
        ok=0;
        for(i=1;i<=n;i++)
        {
            viz[i]=0;
        }
        for(i=1;i<=n;i++)
        {
            if(!r[i])
                ok|=pair_up(i);
        }
    }while(ok);
    int cuplaj=0;
    for(i=1;i<=n;i++)
    {
        cuplaj+=(r[i]>0);
    }
    fout<<cuplaj<<"\n";
    for(i=1;i<=n;i++)
    {
        if(r[i]>0)
        {
            fout<<i<<" "<<r[i]<<"\n";
        }
    }
}