Cod sursa(job #351529)

Utilizator TYTUSVlad Saveluc TYTUS Data 28 septembrie 2009 14:08:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;

const int NMAX = 100001;

vector<int> lv[NMAX];
bool vis[NMAX];
int l[NMAX], r[NMAX];

bool cupleaza(int nod) {
	if (vis[nod])
		return false;
	vis[nod] = true;
	for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it) 
		if (!r[*it]) {
			l[nod] = *it;
			r[*it] = nod;
			return true;
		}

	for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it) {
		if (r[*it] && cupleaza(r[*it])) {
			l[nod] = *it;
			r[*it] = nod;
			return true;
		}
	}
	return false;
}

int main() {
	FILE* fin = fopen("cuplaj.in", "r");
	FILE* fout = fopen("cuplaj.out", "w");
	int n1, n2, m;
	fscanf(fin, "%d%d%d", &n1, &n2, &m);
	while (m--) {
		int a, b;
		fscanf (fin,"%d%d", &a, &b);
		lv[a].push_back(b);
	}
	bool ok = true;
	int ret = 0;
	while (ok) {
		ok = false;
		memset(vis, false, sizeof(vis));
		for (int i = 1; i <= n1; ++i) {
			if (!l[i] && cupleaza(i)) {
				ret++;
				ok = true;
			}
		}
	}
	fprintf (fout, "%d\n", ret);
	for (int i = 1; i <= n1; ++i) 
		if (l[i] != 0) {
			fprintf (fout, "%d %d\n", i, l[i]);
		}
	fclose(fout);
	return 0;
}