Cod sursa(job #1652664)

Utilizator GinguIonutGinguIonut GinguIonut Data 15 martie 2016 11:23:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <string.h>
#define nMax 10009
#define pb push_back
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int L, R, m, u[nMax], l[nMax], r[nMax];
vector<int> G[nMax];
void read()
{
    int x, y;
    fin>>L>>R>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        G[x].pb(y);
    }
}
bool pairup(int node)
{
    if(u[node])
        return 0;
    u[node]=1;
    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
    {
        if(!r[*it])
        {
            l[node]=*it;
            r[*it]=node;
            return 1;
        }
    }
    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
    {
        if(pairup(r[*it]))
        {
            l[node]=*it;
            r[*it]=node;
            return 1;
        }
    }
    return 0;
}
void solve()
{
    for(int change=1;change;)
    {
        change=0;
        memset(u, 0, sizeof(u));
        for(int i=1;i<=L;i++)
            if(!l[i])
                change |= pairup(i);
    }
}
void write()
{
    int Sol=0;
    for(int i=1;i<=L;i++)
        Sol+=(l[i]>0);
    fout<<Sol<<'\n';
    for(int i=1;i<=L;i++)
    {
        if(l[i])
            fout<<i<<" "<<l[i]<<'\n';
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}