Cod sursa(job #555827)

Utilizator Addy.Adrian Draghici Addy. Data 15 martie 2011 19:51:33
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <list>

using namespace std;

#define NMAX 100050
#define MMAX 500050

int S[NMAX], M[MMAX], grad[NMAX], viz[NMAX], N, nod, fiu, n, m, i, x, y, v;
list < pair <int, int> > G[NMAX];

bool eulerian ();
void DFS (int);

int main () {
	
	freopen ("ciclueuler.in", "r", stdin);
	freopen ("ciclueuler.out", "w", stdout);
	
	scanf ("%d %d", &n, &m);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d", &x, &y);
		grad[x]++, grad[y]++;
		G[x].push_back (make_pair (y, i));
		G[y].push_back (make_pair (x, i));
	}
	
	if (eulerian ()) {
		
		S[++N] = 1;
		while (N) {
			
			nod = S[N];
			if (!G[nod].empty ()) {
				fiu = G[nod].back ().first, v = G[nod].back ().second;
				
				if (!M[v]) S[++N] = fiu, M[v] = 1;
				
				G[nod].pop_back ();
			}
			else printf ("%d ", S[N--]);
		}
	}
	else printf ("-1");
	
	return 0;
}

void DFS (int nod) {
	
	viz[nod] = 1;
	for (list < pair <int, int> >::iterator it = G[nod].begin (); it != G[nod].end (); it++)
		if (!viz[it -> first])
			DFS (it -> first);
}

bool eulerian () {
	
	DFS (1);
	
	for (int i = 1; i <= n; i++)
		if (!viz[i] || (grad[i] & 1)) return 0;
	
	return 1;
}