Cod sursa(job #2576071)

Utilizator MihneaGhiraMihnea MihneaGhira Data 6 martie 2020 17:09:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 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 fr[10010],st[10010],dr[10010];
vector<int> L[10010];

int cupleaza(int nod){
    if(fr[nod]==1)
        return 0;
    fr[nod]=1;
    for(int i=0;i<L[nod].size();i++){
        int vecin=L[nod][i];
        if(!dr[vecin]){
            nr++;
            st[nod]=vecin;
            dr[vecin]=nod;
            return 1;
        }
    }

    for(int i=0;i<L[nod].size();i++){
        int vecin=L[nod][i];
        if(cupleaza(dr[vecin])){
            st[nod]=vecin;
            dr[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++)
            fr[i]=0;
        for(int i=1;i<=n;i++){
            if(st[i]==0 && cupleaza(i))
                ok=1;
        }
    }
    fout<<nr<< "\n";
    for(int i=1;i<=n;i++){
        if(st[i]){
            fout<<i<<" "<<st[i]<<"\n";
        }
    }
    return 0;
}