Cod sursa(job #2422909)

Utilizator gaina_gabriela@yahoo.comGaina Gabriela [email protected] Data 20 mai 2019 12:40:42
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <tuple>
#include <bitset>
#include <stack>
using namespace std;

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

const int MaxE = 500001;

using VI   = vector<int>;
using VT   = vector<tuple<int, int>>;
using IT   = VT::iterator;
using VIT  = vector<IT>;
using VVT  = vector<VT>;

bitset<MaxE> v;
VVT G;   // G[x] - vector de muchii
VI ce;   // ciclul eulerian
int N, M;

void CitesteGraf();
void AfiseazaCiclu();
bool EsteEulerian();
void DeterminaCiclu(int x);

int main()
{
	CitesteGraf();
	if (!EsteEulerian())
		fout << "-1";
	else
	{
		DeterminaCiclu(1);
		AfiseazaCiclu();
	}
}

void CitesteGraf()
{
	fin >> N >> M;
	G = VVT(N + 1);
	for (int i = 1, u, v; i <= M; ++i)
	{
		fin >> u >> v;
		G[u].emplace_back(v, i);
		G[v].emplace_back(u, i);
	}
}


void DeterminaCiclu(int x)
{
	VIT p = VIT(N + 1);
	for (int i = 1; i <= N; ++i)
		p[i] = G[i].begin();

	int y, e;
	stack<int> stk;
	stk.push(1);

	while (!stk.empty())
	{
		x = stk.top();
		if (p[x] == G[x].end())
		{
			ce.emplace_back(x);
			stk.pop();
		}
		else
			while (p[x] != G[x].end())
			{
				tie(y, e) = *p[x]++;
				if (v[e]) continue;
				v[e] = 1;
				stk.push(y);
				break;
			}
	}
}

void AfiseazaCiclu()
{
	for (size_t i = 0; i < ce.size() - 1; ++i)
		fout << ce[i] << ' ';
}

bool EsteEulerian()
{
	for (int x = 1; x <= N; ++x)
		if (G[x].size() % 2 == 1)
			return false;
	return true;
}