Cod sursa(job #2502961)

Utilizator MihneaGhiraMihnea MihneaGhira Data 1 decembrie 2019 22:44:26
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,nr,ok,maxim,muchii,x,y;
int stanga[10010],dreapta[10010],f[10010];
vector<int> L[10010];
///
int cupleaza(int nod){
    if(f[nod]==1)
        return 0;

    f[nod]=1;
    for(int i=0;i<L[nod].size(); i++ ){
        int vecin=L[nod][i];
        if(dreapta[vecin]==0){
            nr++;
            stanga[nod]=vecin;
            dreapta[vecin]=nod;
            return 1;
        }
    }

    for(int i=0;i<L[nod].size();i++){
        int vecin=L[nod][i];
        if(cupleaza(dreapta[vecin])==1){
            stanga[nod]=vecin;
            dreapta[vecin]=nod;
            return 1;
        }
    }
    return 0;
}
///
int main(){
    fin>>n>>m>>muchii;
    for(int i=1;i<=muchii;i++){
        fin>>x>>y;
        L[x].push_back(y);
        maxim=max(maxim,max(x,y));
    }
    ok=1;
    while(ok!=0){
        ok=0;
        for(int i=1;i<=maxim;i++)
            f[i]=0;
        for(int i=1;i<=n;i++)
            if(stanga[i]==0 && cupleaza(i)==1)
                ok=1;
    }
    fout<<nr<< "\n";

    for(int i=1;i<=n;i++)
        if(stanga[i]!=0)
            fout<<i<<" "<<stanga[i]<<"\n";

    return 0;
}