Cod sursa(job #515946)

Utilizator feelshiftFeelshift feelshift Data 22 decembrie 2010 19:07:14
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
// http://infoarena.ro/problema/ciclueuler
#include <fstream>
#include <vector>
#include <list>
using namespace std;

int nodes,edges;
vector< list<int> > graph;
list<int> cycle;

void read();
bool eulerianCycle();
void euler(int toVisit);
void write(bool status);

int main() {
	read();

	if(eulerianCycle()) {
		euler(1);
		write(true);
	}
	else
		write(false);

	return (0);
}

void read() {
	ifstream in("ciclueuler.in");
	int from,to;

	in >> nodes >> edges;
	graph.resize(nodes+1);

	for(int i=1;i<=edges;i++) {
		in >> from >> to;

		// multigraf
		graph.at(from).push_back(to);
		graph.at(to).push_back(from);
	}

	in.close();
}

bool eulerianCycle() {
	for(int i=1;i<=nodes;i++)
		if(graph.at(i).size() % 2)
			return false;

	return true;
}

void euler(int toVisit) {
	list<int>::iterator it;
	list<int>::iterator secondIt;
	it = graph.at(toVisit).begin();

	while(it != graph.at(toVisit).end()) {
		secondIt =  graph.at(*it).begin();
		int next = *it;	// it isi va pierde valoare

		while(secondIt != graph.at(*it).end()) {
			if(*secondIt == toVisit) {
				graph.at(*it).erase(secondIt);
				break;
			}

			secondIt++;
		}

		graph.at(toVisit).pop_front();
		euler(next);
		it = graph.at(toVisit).begin();
	}

	cycle.push_back(toVisit);
}

void write(bool status) {
	ofstream out("ciclueuler.out");
	list<int>::iterator it;
	it = cycle.begin();
	it++;

	if(status)
		for(;it!=cycle.end();it++)
			out << *it << " ";
	else
		out << "-1\n";

	out.close();
}