Cod sursa(job #634349)

Utilizator sebii_cSebastian Claici sebii_c Data 15 noiembrie 2011 23:50:38
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <list>
#include <stack>
#include <queue>

using namespace std;
#define pb push_back
#define NMAX 100010

list<int> G[NMAX], L;
stack<int> S;
queue<int> Q;

int n, m, deg[NMAX], vis[NMAX];

void read() 
{
	int x, y;
	scanf("%d %d", &n, &m);
	while (m--) {
		scanf("%d %d", &x, &y);
		G[x].pb(y); ++deg[x];
		G[y].pb(x); ++deg[y];
	}
}

void BFS(int v) 
{
	Q.push(v); vis[v] = 1;
	while (!Q.empty()) {
		v = Q.front(); 
		Q.pop();
		for (list<int>::iterator it = G[v].begin(); it != G[v].end(); ++it) {
			if (vis[*it] == 0) {
				Q.push(*it);
				vis[*it] = 1;
			}
		}
	}
}

int is_connex() 
{
	BFS(1);
	for (int v = 2; v <= n; ++v)
		if (vis[v] == 0)
			return 0;
	return 1;
}

int eulerian() 
{
	if (is_connex() == 0)
		return 0;
	
	for (int v = 1; v <= n; ++v)
		if (deg[v] % 2 == 1)
			return 0;
	return 1;
}

void remove(int v, int w)
{
	--deg[v], --deg[w];
	G[v].pop_front();
	for (list<int>::iterator 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);
		remove(v, w);
		v = w;
	}
}

int result()
{
	int v = eulerian();
	if (v == 0)
		return -1;
	do {
		euler(v);
		v = S.top(); S.pop();
		L.pb(v);
	} while (!S.empty());
	return 1;
}

void print(int x)
{
	if (x == -1)
		printf("-1\n");
	else {
		for (list<int>::iterator it = L.begin(); it != L.end(); ++it)
			printf("%d ", *it);
		printf("\n");
	}
}

int main()
{
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	read();
	print(result());
	return 0;
}