Cod sursa(job #771811)

Utilizator ioana26Ioana Andronescu ioana26 Data 27 iulie 2012 10:00:29
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
/* 
Ciclu Eulerian.
*/

#include <iostream>
#include <list>
#include <stack>
#include <queue>
#include <stdio.h>

#define MAXN	100001

using namespace std;

int nr_noduri, nr_muchii;
int grad[MAXN];
bool vizitat[MAXN];
list<int> graf[MAXN], ciclu_eulerian;
stack<int> stiva;
queue<int> coada;

void bfs () {
	vizitat[1] = 1;
	coada.push(1);

	while (!coada.empty()) {
		int u = coada.front();
		coada.pop();
		for (list<int>::iterator v = graf[u].begin(); v != graf[u].end(); v++) 
			if (!vizitat[*v]) {
				vizitat[*v] = 1;
				coada.push(*v);
			}
	}
}

bool e_conex () {
	bfs();
	for (int u = 2; u <= nr_noduri; u++)
		if (!vizitat[u])
			return 0;
	return 1;
}

bool e_ciclu_eulerian () {
	if (!e_conex())
		return 0;
	for (int u = 1; u <= nr_noduri; u++)
		if (grad[u] % 2)
			return 0;
	return 1;
}

void euler (int u) {
	while (1) {
		if (graf[u].empty())
			break;
		int v = graf[u].front();
		stiva.push(u);
		
		grad[u]--; 
		grad[v]--;
		
		graf[u].pop_front();
		for (list<int>::iterator w = graf[v].begin(); w != graf[v].end(); w++) 
			if (*w == u) {
				graf[v].erase(w);
				break;
			}
		u = v;
	}
}

int afla_ciclu_euler () {
	int x = e_ciclu_eulerian();
	if (!x)
		return -1;
	do {
		euler(x);
		x = stiva.top();
		stiva.pop();
		ciclu_eulerian.push_back(x);
	} while (!stiva.empty());	
	return 1;
}

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

	int i, x, y;
	scanf("%d %d", &nr_noduri, &nr_muchii);
	for (i = 0; i < nr_muchii; i++) {
		scanf("%d %d", &x, &y);
		graf[x].push_back(y);
		grad[x]++;
		graf[y].push_back(x);
		grad[y]++;
	}

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