Cod sursa(job #555647)

Utilizator ooctavTuchila Octavian ooctav Data 15 martie 2011 17:39:46
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<deque>
#include<list>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;

const char IN[] = {"ciclueuler.in"};
const char OUT[] = {"ciclueuler.out"};
const int INF = 1000000005;
const double PI  = 3.14159265;
const int NMAX = 100005;
const int MMAX = 500005;

#define II inline
#define LL long long
#define PII pair<int, int>
#define PDD pair<double, double>
#define fs first
#define sc second
#define mp make_pair
#define pb push_back
#define FOR(i, a, b) 	for(int i = a ; i <= b ; i++)
#define IFOR(i, a, b) 	for(int i = a ; i >= b ; i--)
#define FORITL(it, V) 	for(list<int> :: iterator it = V.begin() ; it != V.end() ; it++)
#define FORIT(it, V) 	for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
#define all(a) a, a + 

int N, M;
list<int> Graf[NMAX];
vector<int> euler;
bitset<NMAX> viz;//int viz[NMAX];
int grad[NMAX];

void citi()
{
	scanf("%d%d", &N, &M);
	FOR(i, 1, M)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		Graf[x].pb(y);
		Graf[y].pb(x);
		grad[x]++;
		grad[y]++;
	}
}

void dfs(int nod)
{
	viz[nod] = 1;
	FORITL(it, Graf[nod])
		if(!viz[*it])
			dfs(*it);
}

bool ok()
{
	//viz.reset();
	dfs(1);
	FOR(i, 1, N)
		if(!viz[i] || grad[i]%2 != 0)
			return 0;
	return 1;
}

void parcurg()
{
	stack<int> st;
	st.push(1);
	while(st.size())
	{
		if(Graf[st.top()].size())
		{
			int x = st.top();
			st.push(Graf[x].front());
			Graf[x].pop_front();
			FORITL(it, Graf[st.top()])
				if(*it == x)
				{
					Graf[st.top()].erase(it);
					break;
				}
		}
		else
		{
			euler.pb(st.top());
			st.pop();
		}
	}
}

void scrie()
{
	if(!ok())
	{
		printf("-1\n");
		return;
	}
	parcurg();
	euler.pop_back();
	FORIT(it, euler)
		printf("%d ", *it);
	printf("\n");
}

int main()
{
	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);
	citi();
	scrie();
	return 0;
}