Cod sursa(job #2408437)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 17 aprilie 2019 22:53:16
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <bitset>

#define dim 10010

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,i,j,k,l[dim],r[dim],sol,ok;
vector <int> v[dim];
bitset <dim> f;

bool cupleaza(int nod){

    if(f[nod]==1)
        return 0;
    f[nod]=1;

    int x;
    for(int i=0;i<v[nod].size();i++){
        x=v[nod][i];
        if(r[x]==0){
            r[x]=nod;
            l[nod]=x;
            sol++;
            return 1;
        }
    }

    for(int i=0;i<v[nod].size();i++){
        x=v[nod][i];
        if(cupleaza(l[x])){
            r[x]=nod;
            l[nod]=x;
            return 1;
        }
    }

    return 0;
}

int main(){
    fin>>n>>m>>k;
    for(;k;k--){
        fin>>i>>j;
        v[i].push_back(j);
    }

    do{
        f.reset();
        ok=0;

        for(i=1;i<=n;i++)
            if(l[i]==0)
                if(cupleaza(i))
                    ok=1;
    }while(ok);

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

    return 0;
}