Cod sursa(job #1216868)

Utilizator pulseOvidiu Giorgi pulse Data 5 august 2014 23:18:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

const int maxn = 100005;
list <int> G[maxn], L;
list <int> :: iterator it;
queue <int> Q;
stack <int> S;

int N, M, grad[maxn];
bool used[maxn];

void BFS()
{
	Q.push(1);
	while (!Q.empty())
	{
		int node = Q.front();
		Q.pop();
		for (it = G[node].begin(); it != G[node].end(); ++it)
		{
			if (!used[*it])
			{
				Q.push(*it);
				used[*it] = 1;
			}
		}
	}
}

inline bool Check_Grade()
{
	for (int i = 1; i <= N; ++i)
		if (grad[i] % 2 == 1) return 0;
	return 1;
}

inline bool Check_Conex()
{
	BFS();
	for (int i = 1; i <= N; ++i)
		if (!used[i]) return 0;
	return 1;
}

inline bool Eulerian()
{
	if (Check_Conex() && Check_Grade()) return 1;
	return 0;
}

inline void Delete(int v, int w)
{
	--grad[v], --grad[w];
	G[v].pop_front();
	for (it = G[w].begin(); it != G[w].end(); ++it)
	{
		if (*it == v)
		{
			G[w].erase(it);
			break;
		}
	}
}

void Euler(int v)
{
	while (true)
	{
		if (G[v].empty()) break;
		int w = G[v].front();
		S.push(v);
		Delete(v, w);
		v = w;
	}
}

void Solve()
{
	int v = Eulerian();
	if (v == 0)
	{
		printf("-1\n");
		return;
	}
	do
	{
		Euler(v);
		v = S.top(), S.pop();
		L.push_back(v);
	} while (!S.empty());
	for (it = L.begin(); it != L.end(); ++it)
		printf("%d ", *it);
	printf("\n");
}

int main()
{
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= M; ++i)
	{
		int v, w;
		scanf("%d %d", &v, &w);
		G[v].push_back(w), ++grad[v];
		G[w].push_back(v), ++grad[w];
	}
	Solve();
	return 0;
}