Cod sursa(job #2402983)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 11 aprilie 2019 10:40:51
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb

#include <iostream>

#include <fstream>

#include <vector>

#include <stack>

#include <tuple>

using namespace std;



ifstream fin("ciclueuler.in");

ofstream fout("ciclueuler.out");



using VI  = vector<int>;

using VT = vector<tuple<int, int>>;

using VVT = vector<VT>;

using IT = vector<VT::iterator>;

using VB  = vector<bool>;



VVT G;

VI c;

int n, m;



void citesteGraf();

void detCiclu(int x);

bool esteEulerian();



int main()

{

	citesteGraf();



	if ( !esteEulerian() ) {

		fout << -1;

	} else {

		detCiclu(1);



		for (size_t i = 0; i < c.size() - 1; ++i)

			fout << c[i] << ' ';

	}

}



void detCiclu(int x)

{

	VB v = VB(m + 1);

	IT p = IT(n + 1);



	for (int i = 1; i <= n; ++i)

		p[i] = G[i].begin();



	int y, e;

	stack<int> stk;

	stk.push(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() ) {

				tie(y, e) = *p[x];

				p[x]++;

				if (v[e]) continue;

				v[e] = true;

				stk.push(y);

				break;

			}

		}

	}

}



bool esteEulerian() {

	for (auto ms : G)

		if (ms.size() & 1)

			return false;

	return true;

}



void citesteGraf()

{

	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);

	}

}