Cod sursa(job #1235835)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 30 septembrie 2014 19:18:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <bitset>
#include <list>
#define DIM 10011
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,E;
int R[DIM],L[DIM];

list<int> M[DIM];
bitset<DIM> viz;

inline int cuplaj(int nod){
    int q;
    list<int>::iterator it;
    if(viz[nod]==1)
        return 0;
    viz[nod]=1;
    //prima incercare
    for(it=M[nod].begin();it!=M[nod].end();it++)
        if(!R[*it]){
            R[*it]=nod,L[nod]=*it;
            return 1;
        }
    //a doua incercare
    for(it=M[nod].begin();it!=M[nod].end();it++){
        q=cuplaj(R[*it]);
        if(q){
            R[*it]=nod,L[nod]=*it;
            return 1;
        }
    }
    return 0;
}


int main(void){
    register int i,j,ok,q,x,y;

    f>>n>>m>>E;
    for(;E;E--)
        f>>x>>y,M[x].push_back(y);

    do{ok=0;
        for(i=1;i<=n;i++){
            if(!L[i])
                q=cuplaj(i);
            if(q) ok=true;
        }
        viz.reset();
    }while(ok);

    int nr=0;
    for(i=1;i<=n;i++)
        nr+=(L[i]==0?0:1);
    g<<nr<<"\n";
    for(i=1;i<=n;i++){
        if(L[i])
            g<<i<<" "<<L[i]<<"\n";
    }
    f.close();
    g.close();
    return 0;
}