Cod sursa(job #3003998)

Utilizator FulopSergiuFulop Sergiu FulopSergiu Data 16 martie 2023 08:23:09
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>
using namespace std;

struct Edge {
	int x, y;
};

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

using VI = vector<int>;
using VVI = vector<VI>;
using VB = vector<bool>;

VVI adj;
VB v;
VI ce;
vector<Edge> E;
int n, m;

void CitesteGraf();
inline void Dfs(int x);
bool EGrafEuler();
void ScrieCicluEuler();

int main()
{
	CitesteGraf();
	if (!EGrafEuler())
		fout << -1;
	else
	{
		Dfs(1);
		ScrieCicluEuler();
	}

	return 0;
}

inline void Dfs(int x)
{
	ce.push_back(x);
	for (int e : adj[x])
	{
		if (v[e]) continue;
		v[e] = true;
		if (E[e].x == x)
			Dfs(E[e].y);
		else
			Dfs(E[e].x);
	}
}

void CitesteGraf()
{
	fin >> n >> m;
	v = VB(m + 1);
	adj = VVI(n + 1);
	E = vector<Edge>(m + 1);
	int x, y;
	for (int i = 1; i <= m; ++i)
	{
		fin >> x >> y;
		adj[x].emplace_back(i);
		adj[y].emplace_back(i);
		E[i] = { x, y };
	}
}

bool EGrafEuler()
{
	for (int x = 1; x <= n; ++x)
		if (adj[x].size() % 2 == 1)
			return false;

	return true;
}

void ScrieCicluEuler()
{
	for (int x : ce)
		fout << x << ' ';
}