Cod sursa(job #559308)

Utilizator bixcabc abc bixc Data 17 martie 2011 19:28:44
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <list>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

#define Nmax 100010

int n, m, rad;
int Gr[Nmax];
list <int> V[Nmax], S;

void citire () {
	
	int i, x, y;

	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);
		Gr[x]++; Gr[y]++;
	}
}

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

	Gr[nod]--;
}

void ciclu () {
	
	int nod = 0, x;
	list <int>::iterator it, it2;

	S.push_back (1);
	for (it = S.begin (); it != S.end (); it++) {
	
		while (Gr[*it]) {
			nod = rad = *it; it2 = it; ++it;
			do {
				x = V[nod].front ();
                V[nod].pop_front ();
                sterge (x, nod);

				Gr[nod]--; Gr[x]--;
				nod = x;
			    S.insert (it, nod);
			} while (rad != nod);

		    it = it2;
		}
	}

	for (it2 = it = S.begin (), ++it2; it2 != S.end (); it++, it2++)
		printf ("%d ", *it);

}

int euler () {
	
	int Q[Nmax], viz[Nmax], p, u, nod, i;
	p = u = 1; Q[1] = 1;
    memset (viz, 0, sizeof (viz));

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

    for (i = 1; i <= n; i++)
		if (!viz[i] || Gr[i] % 2 == 1) return 0;

	return 1;
}

int main () {
	
	freopen ("ciclueuler.in", "r", stdin);
	freopen ("ciclueuler.out", "w", stdout);

	citire ();
    if (!euler ()) {
	    printf ("-1\n");
	    return 0;
	}

	ciclu (); 

	return 0;
}