Cod sursa(job #1004062)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 1 octombrie 2013 23:26:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int L[10010],R[10010],n,m,E;
bool viz[10010];
 
vector<int> C[100010];
 
inline int cuplaj(int nod){
    int rez;
    if(viz[nod]==1){
        return 0;
    }
    viz[nod]=1;
    //prima incercare
    for(register int i=0;i<C[nod].size();i++){
        if(!R[C[nod][i]]){
            L[nod]=C[nod][i];
            R[C[nod][i]]=nod;
            return 1;
        }
    }
    //a doua incercare
    for(register int i=0;i<C[nod].size();i++){
        rez=cuplaj(R[C[nod][i]]);
        if(rez){
            R[C[nod][i]]=nod;
            L[nod]=C[nod][i];
            return 1;
        }
    }
    return 0;
}
 
int main(void){
    register int i,j,x,y;
 
    f>>n>>m>>E;
    for(i=1;i<=E;i++){
        f>>x>>y;
        C[x].push_back(y);
    }
 
    bool ok;
    int rez,nr=0;
    do{ok=false;
        for(i=1;i<=n;i++){
            if(!L[i])
                rez=cuplaj(i);
            if(rez)
                ok=true;
        }
        for(i=1;i<=n;i++){
            viz[i]=false;
        }
    }while(ok);
 
    for(i=1;i<=n;i++)
        if(L[i])
            nr++;
    g<<nr<<"\n";
    for(i=1;i<=n;i++){
        if(L[i])
            g<<i<<" "<<L[i]<<"\n";
    }
    f.close();
    g.close();
    return 0;
}