Cod sursa(job #2399546)

Utilizator angelaAngela Visuian angela Data 7 aprilie 2019 18:26:09
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;

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();
		
	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() ) {
				auto [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);
	for (int i = 1, x, y; i <= m; ++i) {
		fin >> x >> y;
		G[x].emplace_back(y, i);
		G[y].emplace_back(x, i);
	}
}