Cod sursa(job #1133007)

Utilizator sharphTopi Talvitie sharph Data 4 martie 2014 11:24:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <vector>
#include <list>
#include <fstream>

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;
	list<int>::iterator 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() {
	ifstream in("ciclueuler.in");
	in >> n >> m;
	G.resize(n);
	
	for(int i = 0; i < m; ++i) {
		int a, b;
		in >> a >> b;
		--a;
		--b;
		
		list<Edge>::iterator e1 = G[a].insert(G[a].end(), Edge());
		list<Edge>::iterator e2 = G[b].insert(G[b].end(), Edge());
		
		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) {
			ofstream out("ciclueuler.out");
			out << "-1\n";
			return 0;
		}
	}
	
	ret.push_back(0);
	list<int>::iterator pos = ret.begin();
	
	while(pos != ret.end()) {
		while(!G[*pos].empty()) {
			lisaa(pos);
		}
		++pos;
	}
	
	ret.pop_back();
	
	ofstream out("ciclueuler.out");
	for(list<int>::iterator it = ret.begin(); it != ret.end(); ++it) {
		if(it != ret.begin()) {
			out << " ";
		}
		out << *it + 1;
	}
	out << "\n";
	
	return 0;
}