Cod sursa(job #1917673)

Utilizator horiainfoTurcuman Horia horiainfo Data 9 martie 2017 12:45:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

#define ll long long
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct Edge { int n1, n2; bool used; };

vector<int> sol;
vector<Edge*> node[100002];
stack<int> myStack;

void euler()
{
	myStack.push(1);
	while (!myStack.empty())
	{
		int nod = myStack.top();
		if (!node[nod].empty())
		{
			Edge* e = node[nod].back();
			node[nod].pop_back();
			if (!e->used)
			{
				e->used = true;
				myStack.push(e->n1 ^ e->n2 ^ nod);
			}
		}
		else
		{
			myStack.pop();
			sol.push_back(nod);
		}
	}
}

int main()
{
	int n, m;

	fin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		Edge* edge = new Edge();
		fin >> edge->n1 >> edge->n2;

		node[edge->n1].push_back(edge);
		node[edge->n2].push_back(edge);
	}

	for(int i = 1; i <= n; i ++)
		if (node[i].size() & 1)
		{
			fout << -1;
			return 0;
		}

	euler();
	for (int i = 0; i < sol.size() - 1; i++)
		fout << sol[i] << ' ';
	return 0;
}