Cod sursa(job #1132979)

Utilizator sharphTopi Talvitie sharph Data 4 martie 2014 10:56:24
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <vector>
#include <list>

using namespace std;

struct Edge {
	int dest;
	list<Edge>::iterator back;
};

int n, m;
vector<list<Edge>> G;

list<int> ret;
void lisaa(list<int>::iterator after) {
	int v = *after;
	auto before = after;
	++before;
	int x = v;
	do {
		int next = G[x].front().dest;
		G[next].erase(G[x].front().back);
		G[x].erase(G[x].begin());
		x = next;
		ret.insert(before, x);
	} while(x != v);
}

int main() {
	cin >> n >> m;
	G.resize(n);
	
	for(int i = 0; i < m; ++i) {
		int a, b;
		cin >> a >> b;
		--a;
		--b;
		
		G[a].push_back(Edge());
		G[b].push_back(Edge());
		
		list<Edge>::iterator e1 = G[a].end();
		--e1;
		list<Edge>::iterator e2 = (a == b) ? e1 : G[b].end();
		--e2;
		
		e1->dest = b;
		e1->back = e2;
		e2->dest = a;
		e2->back = e1;
	}
	
	for(int i = 0; i < n; ++i) {
		if(G[i].size() == 0 || G[i].size() % 2 == 1) {
			cout << "-1\n";
			return 0;
		}
	}
	
	ret.push_back(0);
	auto pos = ret.begin();
	
	while(pos != ret.end()) {
		while(!G[*pos].empty()) {
			lisaa(pos);
		}
		++pos;
	}
	
	ret.pop_back();
	
	bool first = true;
	for(int v : ret) {
		if(first) {
			first = false;
		} else {
			cout << " ";
		}
		cout << v + 1;
	}
	cout << "\n";
	
	return 0;
}