Cod sursa(job #729555)

Utilizator Addy.Adrian Draghici Addy. Data 29 martie 2012 18:38:44
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <stack>
#include <vector>

#define NMAX 100050
#define MMAX 500050

using namespace std;

bool viz[NMAX], edge[MMAX];
int deg[NMAX], N, M, K;
stack <int> S;
vector < pair <int, int> > G[NMAX];

bool eulerian ();
void dfs (int), compute (), input (), output ();

int main () {
	
	input ();
	
	output ();
	
	return 0;
}

void compute () {
	
	int nod, fiu, m;
	
	S.push (1);
	while (!S.empty ()) {
		nod = S.top ();
		
		if (!G[nod].empty ()) {
			fiu = G[nod].back ().first; m = G[nod].back ().second;
			
			if (!edge[m]) S.push (fiu), edge[m] = 1;
			
			G[nod].pop_back ();
		}
		else {
			printf ("%d ", S.top ());
			S.pop ();
		}
	}
}

void dfs (int nod) {
	
	viz[nod] = 1;
	for (vector < 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] || (deg[i] & 1))
			return 0;
	
	return 1;
}

void input () {
	
	freopen ("ciclueuler.in", "r", stdin);
	
	scanf ("%d %d", &N, &M);
	
	int i, x, y;
	for (i = 1; i <= M; i++) {
		scanf ("%d %d", &x, &y);
		G[x].push_back (make_pair (y, i));
		G[y].push_back (make_pair (x, i));
		deg[x]++, deg[y]++;
	}
}

void output () {
	
	freopen ("ciclueuler.out", "w", stdout);
	
	if (!eulerian ()) printf ("-1\n");
	else compute ();
}