Cod sursa(job #1126272)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 26 februarie 2014 22:19:28
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <bitset>

#define DN 10005
#define pb push_back
using namespace std;

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

bool cupleaza(int nod){

    if(viz[nod])
        return false;
    viz[nod] = true;
    for(int i=0;i<list[nod].size();++i){

        int next_nod = list[nod][i];
        if(!r[next_nod] || cupleaza(r[next_nod])){

            l[nod] = next_nod;
            r[next_nod] = nod;
            return true;
        }
    }
    return false;
}

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

        int a,b;
        f>>a>>b;
        list[a].pb(b);
    }
    bool exista_cuplaj = true;
    for(;exista_cuplaj;){

        exista_cuplaj=false;
        viz&=0;
        for(int i=1;i<=n;++i)
            if(!l[i])
                exista_cuplaj |= cupleaza(i);
    }
    for(int i=1;i<=n;++i)
        if(l[i])
            ++c;
    g<<c<<"\n";
    for(int i=1;i<=n;++i)
        if(l[i])
            g<<i<<" "<<l[i]<<"\n";
    return 0;
}