Cod sursa(job #2072980)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 22 noiembrie 2017 15:58:14
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100005
#define MMAX 500005

struct Muchie {
	int from, to;
};

int N, M;
vector<Muchie> muchii;
bitset<MMAX> viz;
vector<int> graf[NMAX];
stack<int> stiva;
vector<int> sol;

void citire();
bool verificare();
void rezolvare();
void afisare();

int main() {
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);

	citire();

	if(!verificare()) {
		printf("-1\n");
		return 0;
	}

	rezolvare();
	afisare();

	return 0;
}

void citire() {
	scanf("%d %d ", &N, &M);

	for (int i = 1; i <= M; i++) {
		Muchie m;
		scanf("%d %d ", &m.from, &m.to);
		muchii.push_back(m);

		graf[m.from].push_back(muchii.size() - 1);
		graf[m.to].push_back(muchii.size() - 1);
	}
}

bool verificare() {
	for (int i = 1; i <= N; i++) {
		if(graf[i].size() % 2)
			return false;
	}
	return true;
}

void rezolvare() {
	stiva.push(1);

	while(!stiva.empty()) {
		int nod = stiva.top();

		if(graf[nod].size()) {
			int it = graf[nod].back();
			graf[nod].pop_back();

			if(!viz[it]) {
				stiva.push(muchii[it].from != nod ? muchii[it].from : muchii[it].to);
				viz[it] = 1;
			}

			continue;
		}

		stiva.pop();
		sol.push_back(nod);
	}
}

void afisare() {
	for (int i = 0; i < sol.size() - 1; i++)
		printf("%d ", sol[i]);
}