Cod sursa(job #661057)

Utilizator vendettaSalajan Razvan vendetta Data 13 ianuarie 2012 18:27:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 10005

using namespace std;

vector<int> gf[nmax];
int n;//cardinalul primei multimi;
int m;//cardinalul multimii secunde;
int E;//numarul de muchii;
int st[nmax];//st[i] = nodul din partea dreapta cu care e cuplat
int dr[nmax];//dr[i] = nodul din partea stanga cu care e cuplat
bitset<nmax> viz;
int Card_cuplaj;//cardinalul cuplajului

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

void citeste(){

    f>>n>>m>>E;
    for(int i=1; i<=E; ++i){
        int x, y;
        f>>x>>y;
        gf[x].push_back(y);
    }

}

int cupleaza(int nod){

    if (viz[nod] == 1) return 0;//daca am mai vizitit acest nod return 0
    viz[nod] = 1;//altfel il marchez ca vizitat

    for(int i=0; i<gf[nod].size(); ++i){//pentru fiecare vecin al lui nod (din partea dreapta)
        int j = gf[nod][i];// j = vecinul lui i;
        if (dr[j] == 0 || cupleaza(dr[j]) ){//daca vecinul din multimea din dreapta nu a fost cuplat SAU daca a fost, il mai pot cupla
            st[nod] = j;
            dr[j] = nod;
            return 1;
        }
    }

    return 0;

}

void rezolva(){

    for(int ok=1; ok; ){//cat timp exista noduri necuplate
        ok = 0;
        for(int i=1; i<=n; ++i) viz[i] = 0;
        for(int i=1; i<=n; ++i){
            if(st[i] == 0 && cupleaza(i)>0 ){//cat timp nodul i nu a fost cuplat si il pot cupla
                ++Card_cuplaj;
                ok = 1;
            }
        }
    }

}

void scrie(){

    g<<Card_cuplaj<<"\n";
    for(int i=1; i<=n; ++i){//parcurg nodurile primei multimi
        if ( st[i] )//daca gasesc un nod cuplat il afisez;
            g<<i<<" "<<st[i]<<"\n";
    }

}

int main(){

    citeste();
    rezolva();
    scrie();

    f.close();
    g.close();

    return 0;

}