Cod sursa(job #2224409)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 23 iulie 2018 22:15:06
Problema Cuplaj maxim in graf bipartit Scor 28
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DIM 10005
using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
int n,m,e,i,sol,ok,x,y;
int l[DIM],r[DIM];
bitset <DIM> f;
vector <int> L[DIM*10];
/// left[i] - vecinul din drepta din cuplaj al nodului i din stanga\\\
              sau 0 daca i nu e cuplat
/// right[i] - vecinul din stanga din cuplaj al nodului i din dreapta\\\
               sau 0 daca i nu e cuplat

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 (r[vecin] == 0){
            l[nod] = vecin;
            r[vecin] = nod;
            sol++;
            return 1;
        }
    }

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




}
int main (){

    fin>>n>>m>>e;
    for (i=1;i<=e;i++){
        fin>>x>>y;
        L[x].push_back (y);
    }
    do{

        f.reset();
        ok = 0;
        for (i=1;i<=n;i++){
            if (l[i] == 0 && 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;
}