Cod sursa(job #2252187)

Utilizator pinteastefanPintea Teodor Stefan pinteastefan Data 2 octombrie 2018 14:12:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
int vizitateStanga[10001], vizitateDreapta[10001], viz[10001], nr;
vector < int > graff[10001];
int n, m ,e, x, y, k;

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

bool cuplare(int nod){
    if(viz[nod] == 1){
        return 0;
    }
    viz[nod] = 1;

    for (auto p : graff[nod]){
        if(vizitateDreapta[p] == 0){
            vizitateStanga[nod] = p;
            vizitateDreapta[p] = nod;
            return 1;
        }
    }
    for (auto p : graff[nod]){
        if(cuplare(vizitateDreapta[p])){
            vizitateStanga[nod] = p;
            vizitateDreapta[p] = nod;
            return 1;
            }
    }
    return 0;
}

int main() {
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f >> n >> m >> e;
    for (int i = 1; i <= e; i++){
        f >> x >> y;
        vizitateStanga[x] = 0;
        vizitateDreapta[y] = 0;
        graff[x].push_back(y);
    }


    for (int k = 1; k;){
        k = 0;
        visit();
        for (int i = 1; i <= n; i++){
            if(vizitateStanga[i] == 0){
                k |= cuplare(i);
            }
        }
    }

    for (int i = 1; i<= n; i++){
        if(vizitateStanga[i]){
            nr++;
        }
    }
    g << nr << "\n";

    for (int i = 1;  i <= n ; i++){
        if(vizitateStanga[i]){
            g << i << " " << vizitateStanga[i] << "\n";
        }
    }
    return 0;
}