Cod sursa(job #2917151)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 3 august 2022 15:46:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

const int maxN = 1e4 + 5;

vector <int> g[2 * maxN];
int l[maxN], r[2 * maxN];
bool visit[maxN];

int timp = 0;

bool dfs (int node) {

    if(visit[node] == true)
        return false;

    visit[node] = true;

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

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

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

    int ok;
    do
    {
        ok = 1;

        for(int i = 1; i <= n; ++i)
            visit[i] = false;

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

    int ans = 0;
    for(int i = 1; i <= n; ++i)
        if(l[i] != -1)
            ans++;

    fout << ans << '\n';

    for(int i = 1; i <= n; ++i)
        if(l[i] != -1)
            fout << i << " " << l[i] - n << '\n';
}

int main()
{
    int n, m, e;
    fin >> n >> m >> e;

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

    cuplaj(n, m);

    return 0;
}