Cod sursa(job #2844789)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 5 februarie 2022 14:18:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
/*
    Fara random momentan
*/
#include <bits/stdc++.h>

#define NMAX 10000 //zece mii

using namespace std;

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

int N, M, E;
vector <int> G[NMAX + 1];

void Read(){
    fin >> N >> M >> E;

    for(int i = 1; i <= E; i++){
        int x, y;
        fin >> x >> y;
        x--;
        y--;


        G[x].push_back(y);
    }
}

bool gasim(int x, vector<int>& fata, vector<int>& baiat, vector<bool>& viz){
    if(viz[x]){
        return false; //deci printr-o iteratie a algoritmului, putem trece doar o data printr-un baiat
        /*
            si daca incercam iar sa trecem, returneaza false
        */
    }

    viz[x] = true;
    for(auto& y : G[x]){
        if(baiat[y] == -1){
            fata[x] = y;
            baiat[y] = x;

            return true;
        }
    }

    for(auto& y : G[x]){
        if( gasim( baiat[y], fata, baiat, viz ) ){
            fata[x] = y;
            baiat[y] = x;
            return true;
        }
    }

    return false;
}

void Solve(){
    vector<int> fata(N);
    for(auto& x : fata){
        x = -1;
    }

    vector<int> baiat(M);
    for(auto& x : baiat){
        x = -1;
    }

    vector <bool> viz(N);
    for(int i = 0; i < N; i++){
        viz[i] = false;
    }


    bool stop = false;
        while(!stop){
        for(int i = 0; i < N; i++){
            viz[i] = false;
        }


        stop = true;
        for(int x = 0; x < N; x++){
            if( fata[x] == -1 && gasim(x, fata, baiat, viz) ){
                stop = false;
            }
        }
    }

    ///afisare
    int nr_rsp = 0;
    for(int i = 0; i < N; i++){
        if(fata[i] != -1){
            nr_rsp++;
        }
    }

    fout << nr_rsp << "\n";
    for(int i = 0; i < N; i++){
        if(fata[i] != -1){
            fout << i + 1 << ' ' << fata[i] + 1 << "\n";
        }
    }
}


int main()
{
    Read();
    Solve();

    return 0;
}