Cod sursa(job #1549407)

Utilizator grosuGrosu Alex grosu Data 12 decembrie 2015 12:12:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define NMAX 20003

int C[NMAX];
bool viz[NMAX];

int len[NMAX];
vector<int> vecini[NMAX];

int n;
int na, nb;

void init();
void adaugaVecin(int nod, int i);


struct cuplaj{
    int x, y;
};

void adaugaVecin(int i, int j){
    vecini[i].push_back(j);
    len[i]++;
    vecini[j].push_back(i);
    len[j]++;
}

void init(){
    for(int i=0; i<=n; i++){
        C[i] = -1;
    }
}

void clearViz(int n){
    for(int i=0; i<=n; i++)
        viz[i] = false;
}

void read(){
    int x;
    fin>>na;
    fin>>nb;

    n = na+nb;

    init();

    fin>>x;

    for(int i=1; i<=x; i++){
        int a, b;
        fin>>a>>b;

        b += na;
        adaugaVecin(a, b);
    }
}

int DFS(int i){
    viz[i] = true;

    for(int j=0; j<len[i]; j++){
        int k = vecini[i][j];

        if(viz[k] || C[i] == k)continue;

        if(C[k] == -1){/// Daca e Nelegat
            viz[k] = true;
            C[k] = i;
            C[i] = k;
            return 1;
        }else{/// DACA E LEGAT
            viz[k] = true;
            if(DFS(C[k])){
                C[k] = i;
                C[i] = k;
                return 1;
            }
            else continue;
        }
    }
    return 0;
}

int main()
{

    read();

    /*for(int i=1; i<=na; i++){
        if(C[vecini[i][0]] == -1 && C[i] == -1){
            C[i] = vecini[i][0];
            C[vecini[i][0]] = i;
        }
    }
    */

    bool ok = true;
    while(ok){
        clearViz(n);
        ok = false;
        for(int i=1; i<=na; i++){
            if(!viz[i] && C[i] == -1)
                if(DFS(i))ok = true;
        }
    }

    cuplaj match[NMAX];
    int length = 0;

    clearViz(n);

    for(int i=1; i<=n; i++){
        if(C[i] != -1 && !viz[i]){
            match[length].x = i;
            match[length].y = C[i]-na;
            length++;
            viz[i] = viz[C[i]] = true;
        }
    }

    fout<<length<<'\n';
    for(int i=0; i<length; i++){
        fout<<match[i].x<<' '<<match[i].y<<'\n';
    }
}