Cod sursa(job #399677)

Utilizator bixcabc abc bixc Data 20 februarie 2010 21:56:02
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <list>
using namespace std;

#define Nmax 100010

list <int> S, V[Nmax];
list <int>::iterator it, it2;
int n, m, i, x, y;
int viz[Nmax], grad[Nmax];

void dfs (int nod) {
	
	viz[nod] = 1;
	
	for (list <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++) 
		if (!viz[ *it ])
			dfs ( *it );
}

int conex () {
	
	dfs (1);
	for (int i = 1; i <= n; i++)
		if (!viz[i]) return 0;
	
	return 1;
}

int grad_par () {
	
	for (int i = 1; i <= n; i++)
		if ( (grad[i]&1) == 1 ) return 0;
	
	return 1;
}

void sterge (int x, int y) {
	
	for (list <int>::iterator it = V[x].begin (); it != V[x].end (); it++) 
		if (*it == y) {
			V[x].erase (it);
			return ;
		}
}

void parc (int nod) {
	
	int v = nod, fiu;
	do {
		fiu = V[v].front ();
		V[v].pop_front ();
		sterge (fiu, v);
		
		S.insert (it2, fiu);
		
		v = fiu;
	} while (v != nod);
}

void euler () {
	
	S.push_back (1);
	int nod;
	
	for (it = S.begin (); it != S.end (); it++) {
		nod = *it;
		if (V[nod].begin() != V[nod].end() ) {	
			it2 = it; it2++;
			parc (nod);
		}
	}
	
	S.pop_back ();
	for (it = S.begin (); it != S.end (); it++) 
		printf ("%d ", *it);
}

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);
		V[x].push_back (y);	V[y].push_back (x);
		grad[x]++; grad[y]++;
	}
	
	if (!conex () || !grad_par()) {
		printf ("%d", -1);
		return 0;
	}
	
	euler ();
	
	return 0;
}