Cod sursa(job #1004058)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 1 octombrie 2013 23:21:47
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("java.in");
ofstream g("java.out");
int T,m,n,E,L[10011],R[10011];
bool viz[10011];

vector<int> C[10011];

inline int cuplaj(int nod){
    int rez;
    if(viz[nod])
        return 0;
    viz[nod]=true;
    //plrima 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){
            L[nod]=C[nod][i];
            R[C[nod][i]]=nod;
            return 1;
        }
    }
    return 0;
}

int main(void){
    register int i,j,x,y,nr,rez;
    bool ok;

    f>>T;
    for(;T>0;T--){
        f>>m>>n>>E;
        for(;E>0;E--)
            f>>x>>y,C[x].push_back(y);
        do{ok=false;
            rez=0;
            for(i=1;i<=n;i++){
                if(!L[i]){
                    rez=cuplaj(i);
                }
                if(rez)
                    ok=true;
            }
            for(i=1;i<=m;i++)
                viz[i]=false;
        }while(ok);
        nr=0;
        for(i=1;i<=m;i++)
            C[i].clear(),nr+=(L[i]>0?1:0),L[i]=0;
        for(i=1;i<=n;i++)
            R[i]=0;
        g<<nr<<"\n";
    }

    f.close();
    g.close();
    return 0;
}