Cod sursa(job #128171)

Utilizator MariusMarius Stroe Marius Data 26 ianuarie 2008 16:16:16
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const char iname[] = "strazi.in";
const char oname[] = "strazi.out";

#define MAXN  256

vector <int> G[MAXN];

int n;

int l[MAXN], r[MAXN];  bool u[MAXN];

FILE *fout;


void read_in(void)
{
	FILE *fin = fopen(iname, "r");

	int cnt, x, y;

	fscanf(fin, "%d %d", &n, &cnt);
	for (; cnt > 0; -- cnt)
	{
		fscanf(fin, "%d %d", &x, &y);
		G[x].push_back(y);
	}
	
	fclose(fin);
}

int pairup(int n)
{
	if (u[n])
		return 0;
	u[n] = true;
	vector <int>::iterator i;
	for (i = G[n].begin(); i != G[n].end(); ++ i) if (!r[*i]) {
		l[n] = *i, r[*i] = n;
		return 1;
	}
	for (i = G[n].begin(); i != G[n].end(); ++ i) if (pairup(r[*i])) {
		l[n] = *i, r[*i] = n;
		return 1;
	}
	return 0;
}

void print(int x)
{
	u[x] = true;

	if (!l[x]) {
		for (int i = 1; i <= n; ++ i) if (!u[i] && !r[i]) {
			fprintf(fout, "%d %d\n", x, i);
			l[x] = i;
			print(i);
			break ;
		}
		return ;
	}
	print(l[x]);
}

int main(void)
{
	read_in();

	int cnt = 0, i, s;

	for (i = 1; i <= n; ++ i)
		cnt += pairup(i);
	while (cnt > 0) {
		memset(u, 0, sizeof(u));
		cnt = 0;
		for (i = 1; i <= n; ++ i) if (!l[i])
			cnt += pairup(i);
	}
	cnt = 0;
	for (i = 1; i <= n; ++ i) if (!r[i])
		cnt ++;

	fout = fopen(oname, "w");

	fprintf(fout, "%d\n", cnt - 1);
	memset(u, 0, sizeof(u));
	for (i = 1; i <= n; ++ i) if (!r[i]) {
		print(i), s = i;
		break ;
	}
	for (i = 1; i <= n; ++ i, s = l[s])
		fprintf(fout, "%d ", s);

	return 0;
}