Cod sursa(job #1622016)

Utilizator ArkinyStoica Alex Arkiny Data 1 martie 2016 00:04:02
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<vector>
#include<bitset>
#include<stack>
#include<algorithm>
using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

vector<int> G[100010];
bitset<100010> viz;
int A[100010],N,M;
stack<int> S;

void DFS(int node)
{
	viz[node] = 1;

	for (int i = 0; i < G[node].size(); ++i)
		if (viz[G[node][i]] == 0)
			DFS(G[node][i]);
}

int main()
{
	in >> N >> M;

	for (int i = 1; i <= M; ++i)
	{
		int x, y;
		in >> x >> y;
		A[x]++;
		A[y]++;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	int k;
	for (int i = 1; i <= N;++i)
		if (A[i])
		{
			DFS(i);
			k = i;
			break;
		}
	for (int i = 1; i <= N;++i)
		if ((viz[i] == 0 && A[i]) || A[i] % 2 != 0)
		{
			out << -1;
			return 0;
		}
	S.push(k);
	while (S.size())
	{
		int el = S.top();
		if (A[el] == 0)
		{
			S.pop();
			out << el << " ";
		}
		else
		{
			int node = G[el].back();
			G[el].pop_back();
			G[node].erase(find(G[node].begin(), G[node].end(), el));
			A[node]--;
			A[el]--;
			S.push(el);
		}

	}
	return 0;
}