Cod sursa(job #1349494)

Utilizator theprdvtheprdv theprdv Data 20 februarie 2015 11:42:20
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;
fstream fin("ciclueuler.in", ios::in);
fstream fout("ciclueuler.out", ios::out);

# define MAXN 100001
vector <int> list[MAXN], euler_cycle, cycle;
vector <int>::iterator it;
int n, m;

void read()
{
	int x, y;
	fin >> n >> m;
	for (int i = 1; i <= m; i++)
		fin >> x >> y,
		list[x].push_back(y),
		list[y].push_back(x);
	fin.close();
}
bool is_euler()
{
	for (int i = 1; i <= n; i++)
		if (list[i].size() % 2 != 0 || !list[i].size())	return false;
	return true;
}
void find_cycle(int node)
{
	cycle.push_back(node);
	if (list[node].size())
	{
		int next_node = list[node].front();
		it = find(list[next_node].begin(), list[next_node].end(), node);
		list[next_node].erase(it);
		list[node].erase(list[node].begin());
		find_cycle(next_node);
	}
}
inline void add_cycle(int position)
{
	euler_cycle.insert(euler_cycle.begin() + position + 1, cycle.begin() + 1, cycle.end());
	cycle.clear();
}


int main()
{
	read();
	if (!is_euler())
	{
		fout << "-1";
		fout.close();
		return 0;
	}
	euler_cycle.push_back(1);
	int end_grades = 0, i;
	while (!end_grades)
	{
		for (i = 0; i < euler_cycle.size() && !list[euler_cycle[i]].size(); i++);
		if (i < euler_cycle.size())
			find_cycle(euler_cycle[i]),
			add_cycle(i);
		else end_grades = 1;
	}
	for (int i = 0; i < euler_cycle.size() - 1; i++)
		fout << euler_cycle[i] << " ";
		
	fout.close();
	return 0;
}