Cod sursa(job #431500)

Utilizator AndreyPAndrei Poenaru AndreyP Data 1 aprilie 2010 07:06:05
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<stdio.h>
#include<stdlib.h>
#include<list>
#include<stack>
#include<queue>
#include<bitset>
#include<set>
using namespace std;
#define N 100010
#define pb push_back
int n,m;
int deg[N];
bitset<N> viz;
list<int> r;
multiset<int> a[N];
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);
		a[x].insert(y);
		a[y].insert(x);
	}
}
inline void bfs()
{
	viz[1]=1;
	q.push(1);
	while(!q.empty())
	{
		int nod=q.front();
		q.pop();
		for(multiset<int>::iterator it=a[nod].begin(),lim=a[nod].end(); it!=lim; ++it)//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].begin());
		a[nod].erase(a[nod].begin());
		a[nod1].erase(a[nod1].find(nod));
		//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;
}