Cod sursa(job #2988215)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 3 martie 2023 20:06:01
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <bitset>
#include <vector>
#include <stack>
using namespace std;
string file = "ciclueuler";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
const int N = 1e5, M = 5e5;
struct muchie {
	int x, y;
};
muchie e[M + 1];

bitset <M + 1> sters;

vector <int> a[N + 1], ciclul;

stack <int> S;

unsigned int ultimul[N + 1];

int celalalt(muchie m, int x)
{
	return (m.x + m.y - x);
}
void euler(int x)
{
	S.push(x);
	while (!S.empty())
	{
		int y = 0;
		x = S.top();
		while (ultimul[x] < a[x].size() && y == 0) // parcurgem muchiile lui x de unde am ramas
		{
			int ind = a[x][ultimul[x]];
			if (!sters[ind])
			{
				y = celalalt(e[ind], x);
				sters[ind] = 1;
			}
			ultimul[x]++;
		}
		if (y)
		{
			S.push(y);
		}
		else
		{
			S.pop();
			ciclul.push_back(x);
		}
		
	}
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> e[i].x >> e[i].y;
		a[e[i].x].push_back(i);
		a[e[i].y].push_back(i);
	}
	for (int i = 1; i <= n; i++)
	{
		if (a[i].size() % 2)
		{
			cout << -1;
			return 0;
		}
	}
	euler(e[0].x);
	for (int x : ciclul)
	{
		cout << x << ' ';
	}
}