Cod sursa(job #1635605)

Utilizator redcrocodileIlies Andreea redcrocodile Data 6 martie 2016 19:13:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");


vector<int> V[10001];
bitset<10001> viz;
int Sol[10001],cup[10001],sol;

int pairup(int nod)
{
    int vecin;
    if(viz[nod]) return 0;
    viz[nod]=1;
    for(size_t i=0;i<V[nod].size();i++)
    {
        vecin=V[nod][i];
        if(!cup[vecin])
        {
            sol++;
            Sol[nod]=vecin;
            cup[vecin]=nod;
            return 1;
        }
    }
    for(size_t i=0;i<V[nod].size();i++)
    {
        vecin=V[nod][i];
        if(pairup(cup[vecin]))
        {
            Sol[nod]=vecin;
            cup[vecin]=nod;
            return 1;
        }
    }
    return 0;
}
int n,m;
void citire()
{
    int a,b,e;
    f>>n>>m>>e;
    for(int i=1;i<=e;i++)
    {
        f>>a>>b;
        V[a].push_back(b);
    }
}
void cuplare()
{
    int ok=1;
    while(ok==1)
    {
        ok=0;
        viz.reset();
        for(int i=1;i<=n;i++)
            if(!Sol[i] and pairup(i)) ok=1;
    }
}
void afisare()
{
    g<<sol<<"\n";
    for(int i=1;i<=n;i++)
        if(Sol[i]) g<<i<<" "<<Sol[i]<<"\n";
}
int main()
{
    citire();
    cuplare();
    afisare();
    return 0;
}