Cod sursa(job #1784835)

Utilizator ArkinyStoica Alex Arkiny Data 20 octombrie 2016 15:53:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

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

int viz[100010], N, M,H[100010];

vector<int> G[100010],euler,stk;

void dfs(int x)
{
	viz[x] = 1;

	for (int i = 0;i < G[x].size();++i)
		if (!viz[G[x][i]])
			dfs(G[x][i]);
}

int main()
{
	in >> N >> M;

	for (int i = 1;i <= M;++i)
	{
		int x, y;
		in >> x >> y;

		H[x]++;
		H[y]++;

		G[x].push_back(y);
		G[y].push_back(x);
	}

	for (int i = 1;i <= N;++i)
		if (H[i] % 2 != 0)
		{
			out << -1;
			return 0;
		}
	dfs(1);
	for (int i = 1;i <= N;++i)
		if (!viz[i])
		{
			out << -1;
			return 0;
		}

	stk.push_back(1);

	while (stk.size())
	{
		if (!H[stk.back()])
		{
			euler.push_back(stk.back());
			stk.pop_back();
			continue;
		}

		if (H[stk.back()])
		{
			int x = stk.back();
			H[x]--;
			H[G[x][G[x].size()-1]]--;
			G[G[x][G[x].size() - 1]].erase(find(G[G[x][G[x].size() - 1]].begin(), G[G[x][G[x].size() - 1]].end(), stk.back()));
			stk.push_back(G[x][G[x].size() - 1]);
			G[x].pop_back();
		}
	}

	for (int i = 0;i < euler.size()-1;++i)
		out << euler[i] << " ";
	

	return 0;
}