Cod sursa(job #3166510)

Utilizator maiaauUngureanu Maia maiaau Data 8 noiembrie 2023 21:01:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>
using namespace std;
#define pb push_back

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

const int N = 2e4+3;

int n, cup[N], t;
vector<vector<int>> e;
bitset<N> u;

void read(), cupmax();
bool cupleaza(int);

int main()
{
	read();
	cupmax();
	g << t << '\n';
	for (int i = 1; i <= n; i++)
		if (cup[i]) g << i << ' ' << cup[i] - n << '\n';

	return 0;
}

void read(){
	int m, E;
	f >> n >> m >> E;
	e.resize(n + m + 3);
	while (E--){
		int a, b; f >> a >> b; b += n;
		e[a].pb(b); e[b].pb(a);
	}
}
void cupmax(){
	bool c = 1;
	do {
		c = 0; u.reset();
		for (int i = 1; i <= n; i++)
			if (!u[i] && !cup[i])
				if (cupleaza(i))
					c = 1, t++;

	} while (c);

}
bool cupleaza(int nod){
	if (u[nod]) return 0;
	u[nod] = 1;
	for (auto v: e[nod])
		if (!cup[v]){
			cup[v] = nod;
			cup[nod] = v;
			return 1;
		}
	for (auto v: e[nod])
		if (cupleaza(cup[v])){
			cup[v] = nod;
			cup[nod] = v;
			return 1;
		}
	return 0;
}