Cod sursa(job #607938)

Utilizator vlad.maneaVlad Manea vlad.manea Data 13 august 2011 21:12:08
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <cstdio>
#include <map>
#include <stack>
#include <vector>
#define INFILE "ciclueuler.in"
#define OUTFILE "ciclueuler.out"
#define NMax 100001
using namespace std;

int N, M, A;
map<int, int> E[NMax];
stack<int> S;
bool viz[NMax];
int counter[NMax];
vector<int> stuff;

void check(int k)
{
	map<int, int>::iterator f;
	viz[k] = true;
	for (f = E[k].begin(); f != E[k].end(); ++f)
		if (!viz[f->first])
			check(f->first);
}

int main()
{
	int x, y;
	map<int, int>::iterator f;
	freopen(INFILE, "r", stdin);
	freopen(OUTFILE, "w", stdout);
	scanf("%d%d", &N, &M);

	// citesc muchiile
	while (M--)
	{
		scanf("%d%d", &x, &y);

		if (x == y)
		{
			counter[x]++;
			continue;
		}

		// adaug la x
		f = E[x].find(y);
		if (f == E[x].end())
			E[x].insert(make_pair(y, 1));
		else
			f->second++;

		// adaug la y
		f = E[y].find(x);
		if (f == E[y].end())
			E[y].insert(make_pair(x, 1));
		else
			f->second++;

	}

	for (int i = 1; i <= N; ++i)
	{
		for (y = 0, f = E[i].begin(); f != E[i].end(); ++f)
			if (f->first != i)
				y += f->second;
		
		if (y % 2)
		{
			printf("-1\n");
			return 0;
		}
	}

	check(1);
	for (int i = 1; i <= N; ++i)
		if (!viz[i])
		{
			printf("-1\n");
			return 0;
		}

	// adaug primul nod
	S.push(1);

	// simulez recursia
	while (!S.empty())
	{
		// preiau nodul curent
		x = S.top();

		// are fii?
		if (E[x].size() > 0)
		{
			f = E[x].begin();
			y = f->first;

			// adaug fiul lui
			S.push(y);

			// distrug legatura dinspre x
			if (f->second == 1)
				E[x].erase(y);
			else
				f->second--;

			// distrug legatura dinspre y
			f = E[y].find(x);
			if (f->second == 1)
				E[y].erase(x);
			else
				f->second--;
		}
		else
		{
			// scriu buclele
			for (int i = 1; i <= counter[x]; ++i)
				stuff.push_back(x);

			// scriu nodul
			stuff.push_back(x);
			counter[x] = 0;

			// elimin nodul curent
			S.pop();
		}
	}

	//scriu solutia
	stuff.pop_back();
	for (int i = 0; i < stuff.size(); ++i)
		printf("%d ", stuff[i]);

	printf("\n");
	return 0;
}