Cod sursa(job #869803)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 2 februarie 2013 12:53:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <bitset>
#define DN 20005
#define pb push_back
using namespace std;

vector<int> list[DN];
bitset<DN> viz;
int l[DN],r[DN];

int cupleaza(int nod)
{
    if(viz[nod]) /// e cuplat
        return 0;
    viz[nod]=1;

    for(int i=0;i<list[nod].size();++i)
    {
        int next_nod=list[nod][i];
        if( r[next_nod]==0 || cupleaza(r[next_nod]) )
        {
            l[nod]=next_nod;
            r[next_nod]=nod;
            return 1;
        }
    }
    return 0;
}


int main()
{
    int n,m,e,nrc=0;
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n>>m>>e;

    for(int i=1;i<=e;++i)
    {
        int x,y;
        f>>x>>y;
        list[x].pb(y);
    }
    bool ok=true;
    while(ok)
    {
        ok=false;
        viz&=0;
        for(int i=1;i<=n;++i)
            if(l[i]==0) // nu ii cuplat
                ok|=cupleaza(i);
    }
    for(int i=1;i<=n;++i)
        nrc+=(0<l[i]); // daca nodul i e cuplat
    g<<nrc<<"\n";
    for(int i=1;i<=n;++i)
        if(l[i])
            g<<i<<" "<<l[i]<<"\n";


    return 0;
}