Cod sursa(job #2837122)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 21 ianuarie 2022 19:51:24
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int maxN = 1e4 + 5;

vector <int> g[2 * maxN];
bool vizitat[maxN];

int l[maxN], r[2*maxN];

bool dfs(int node) {
    if(vizitat[node] == true)
        return false;

    vizitat[node] = true;
    for(int to : g[node])
        if(r[to] == -1) {
            r[to] = node;
            l[node] = to;
            return true;
        }

    for(int to : g[node])
        if(dfs(r[to]) == true) {
            r[to] = node;
            l[node] = to;
            return true;
        }
    return false;
}


void maximumMatch (int n, int m) {
    for(int i = 1; i <= n; ++i) l[i] = -1;
    for(int i = 1; i <= m; ++i) r[n+i] = -1;

    int ok = 1;
    while(ok == 1) {
        ok = 0;
        for(int i = 1; i <= n; ++i) vizitat[i] = false;

        for(int i = 1; i <= n; i++)
            if(l[i] == -1 && dfs(i) == true)
                ok = 1;
    }

    vector <pair <int,int> > ans;
    for(int i = 1; i <= n; ++i)
        if(l[i] != -1)
            ans.push_back({i, l[i] - n});

    cout << ans.size() << "\n";
    for(auto edge : ans)
        cout << edge.first << " " << edge.second << "\n";
}

int main () {

    int n, m, muchii;
    fin >> n >> m >> muchii;

    for(int i = 1; i <= muchii; ++i) {
        int u, v; fin >> u >> v;
        g[u].push_back(v+n);
        g[v+n].push_back(u);
    }

    maximumMatch(n, m);

    return 0;
}