Cod sursa(job #431501)

Utilizator AndreyPAndrei Poenaru AndreyP Data 1 aprilie 2010 07:08:59
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<stdio.h>
#include<stdlib.h>
#include<list>
#include<stack>
#include<queue>
#include<bitset>
using namespace std;
#define N 100010
#define pb push_back
int n,m;
int deg[N];
bitset<N> viz;
list<int> a[N],r;
queue<int> q;
stack<int> st;
inline void citire()
{
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i=0; i<m; ++i)
	{
		scanf("%d%d",&x,&y);
		++deg[x];
		++deg[y];
		a[x].pb(y);
		a[y].pb(x);
	}
}
inline void bfs()
{
	viz[1]=1;
	q.push(1);
	while(!q.empty())
	{
		int nod=q.front();
		q.pop();
		for(list<int>::iterator it=a[nod].begin(); it!=a[nod].end(); ++it)
		{
			if(viz[*it])
				continue;
			viz[*it]=1;
			q.push(*it);
		}
	}
}
inline void sansa()
{
	for(int i=1; i<=n; ++i)
	{
		if(deg[i]&1)
		{
			fputs("-1\n",stdout);
			exit(0);
		}
	}
	bfs();
	for(int i=1; i<=n; ++i)
	{
		if(!viz[i])
		{
			fputs("-1\n",stdout);
			exit(0);
		}
	}
}
inline void sterge(int nod,int nod1)
{
	a[nod].pop_front();
	for(list<int>::iterator it=a[nod1].begin(); it!=a[nod1].end(); ++it)
	{
		if(*it==nod)
		{
			a[nod1].erase(it);
			return;
		}
	}
}
inline void euler(int nod)
{
	while(!a[nod].empty())
	{
		int nod1=a[nod].front();
		sterge(nod,nod1);
		st.push(nod);
		nod=nod1;
	}
}
inline void rezolva()
{
	int nod=1;
	do
	{
		euler(nod);
		nod=st.top();
		st.pop();
		r.pb(nod);
	}while(!st.empty());
}
inline void scrie()
{
	printf("%d",r.front());
	list<int>::iterator it=r.begin();
	for(++it; it!=r.end(); ++it)
		printf(" %d",*it);
	fputc('\n',stdout);
}
int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	citire();
	sansa();
	rezolva();
	scrie();
	return 0;
}