Cod sursa(job #2769226)

Utilizator lahayonTester lahayon Data 14 august 2021 11:09:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <unordered_set>
#include <string>
#include <unordered_map>
#include <random>
#include <ctime>
#include <queue>

using namespace std;

bool augment_path(int node, vector<int>& used, vector<int>& left, vector<int>& right, const vector<vector<int>>& graph){

    if(used[node])
        return false;

    used[node] = true;
    for(auto adj : graph[node])
        if(right[adj] == 0 || augment_path(right[adj], used, left, right, graph)){
            left[node] = adj;
            right[adj] = node;
            return true;
        }
    
    return false;
}

int main()
{

    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");

    int N, M, E; cin >> N >> M >> E;
    vector<vector<int>> graph(N + M + 1);
    for(int x, y; E > 0; --E){
        cin >> x >> y;
        graph[x].push_back(y);
    }

    vector<int> left(N + 1, 0), right(M + 1, 0);
    bool repeat = true;
    while(repeat){

        repeat = false;
        vector<int> used(N + 1, false);
         for(int i = 1; i <= N; ++i)
            if(left[i] == 0 && augment_path(i, used, left, right, graph))
                repeat = true;
    }
   
    int res = 0;
    for(int i = 1; i <= N; ++i)
        if(left[i])
            ++res;
    cout << res << "\n";
    for(int i = 1; i <= N; ++i)
        if(left[i])
            cout << i << " " << left[i] << "\n";

    cin.close();
    cout.close();
 
    return 0;
}