Cod sursa(job #2416434)

Utilizator PaulTPaul Tirlisan PaulT Data 27 aprilie 2019 15:58:35
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <stack>
#include <tuple>
using namespace std;

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

int n, m;
VVT G;
VI c;
VB v;
stack<int> stk;

void Read();
bool Euler();
void Cycle(int x);
void Write();

int main()
{
	Read();
	Write();
}

void Write()
{
	ofstream fout("ciclueuler.out");
	if (!Euler())
		fout << -1;
	else
	{
		Cycle(1);
		for (size_t i = 0; i < c.size() - 1; i++)
			fout << c[i] << ' ';
	}
}

void Cycle(int x)
{
	v = VB(m + 1);
	VIT p = VIT(n + 1);
	for (int i = 1; i <= n; i++)
		p[i] = G[i].begin();
	stk.emplace(x);
	
	while (!stk.empty())
	{
		x = stk.top();
		if (p[x] == G[x].end())
		{
			stk.pop();
			c.emplace_back(x);	
		}
		else
			while (p[x] != G[x].end())
			{
				auto [y, e] = *p[x];
				p[x]++;
				if (v[e])
					continue;
				v[e] = true;
				stk.emplace(y);
				break;
			}
	}
}

bool Euler()
{
	for (int x = 1; x <= n; x++)
		if (G[x].size() & 1)
			return false;
	return true;
}

void Read()
{
	ifstream fin("ciclueuler.in");
	fin >> n >> m;
	G = VVT(n + 1);
	int x, y;
	for (int i = 1; i <= m; i++)
	{
		fin >> x >> y;
		G[x].emplace_back(y, i);
		G[y].emplace_back(x, i);
	}
}