Cod sursa(job #3137044)

Utilizator racsosabeVictor Racso Galvan Oyola racsosabe Data 10 iunie 2023 20:04:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include<bits/stdc++.h>
using namespace::std;

void setIO(string name) {
    string input = name + ".in";
    string output = name + ".out";
    freopen(input.c_str(), "r", stdin);
    freopen(output.c_str(), "w", stdout);
}

struct BipartiteMatcher {
	vector<vector<int>> g;
	vector<int> L, R;
	vector<bool> vis;
	
	BipartiteMatcher(int n, int m):
		g(n), L(n, -1), R(m, -1), vis(n) {} 

	void addEdge(int a, int b) {
		g[a].emplace_back(b);
	}

	bool match(int x) {
		if (vis[x]) return 0;
		vis[x] = 1;
		for (int v : g[x])
			if (R[v] == -1)
				return R[L[x]=v]=x, 1;
		for (int v : g[x])
			if (match(R[v]))
				return R[L[x]=v]=x, 1;
		return 0;
	}
	
	int solve() {
		int cnt = 1;
		//vector<int> ind(L.size());
		//for (int i = 0; i < ind.size(); ++i) {
		//	ind[i] = 1;
		//}
		//shuffle(ind.begin(), ind.end(), rng);
		while (cnt--) {
			fill(vis.begin(), vis.end(), 0);
			for (int i = 0; i < L.size(); ++i) {
				cnt |= L[i] == -1 and match(i);
			}
		}
		int res = 0;
		for (int i = 0; i < L.size(); ++i) {
			res += L[i] != -1;
		}
		return res;
	}
};

int main() {
    setIO("cuplaj");
    int n, m, e;
	scanf("%d %d %d", &n, &m, &e);
    BipartiteMatcher Solver(n, m);
    for(int i = 0; i < e; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        u--; v--;
        Solver.addEdge(u, v);
    }
    printf("%d\n", Solver.solve());
    for(int i = 0; i < n; i++) {
        if(Solver.L[i] == -1) continue;
        printf("%d %d\n", i + 1, Solver.L[i] + 1);
    }
	return 0;
}