Cod sursa(job #3248666)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 12 octombrie 2024 15:19:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <vector>
#define NMAX 10005
#include<cstring>
#include<fstream>

using namespace std;

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

vector<vector<int>> gr;
int n,m,e;
int u,v;
int r[NMAX], l[NMAX];
bool vizitat[NMAX];
void cuplaj(int a, int b){
    l[a]=b;
    r[b]=a;
}
bool cupleaza(int nod){
    if(vizitat[nod]==true){
        return false;
    }
    vizitat[nod]=true;
    for(int i: gr[nod]){
        if(!r[i]){ ///daca nu e cuplat cu nimeni
            cuplaj(nod,i);
            return true;
        }
    }
    for(int i: gr[nod]){
        if(cupleaza(r[i])){
            cuplaj(nod,i);
            return true;
        }
    }
    return false;
}
void afisare(){
    int ct=0;
    for(int i=1; i<=n; ++i){
        if(l[i]){
            ct++;
        }
    }
    fout << ct << '\n';
    for(int i=1; i<=n; ++i){
        if(l[i]){
            fout << i << ' ' << l[i] << '\n';
        }
    }
}
int main()
{
    fin >> n >> m >> e;
    gr.resize(n+1);
    for(int i=1; i<=e; ++i){
        fin >> u >> v;
        gr[u].push_back(v);
    }
    bool ok=true;
    while(ok){
        ok=false;
        memset(vizitat, 0, sizeof vizitat);
        for(int i=1; i<=n; ++i){
            if(!l[i]){
                if(cupleaza(i)){
                    ok=true;
                }
            }
        }
    }
    afisare();
    return 0;
}