Cod sursa(job #558335)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 17 martie 2011 11:02:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<list>
#include<queue>
#include<stack>
#include<bitset>

using namespace std;

int i,j,n,m,grad[100005],r[500005];

list< int > a[100005],rez;
queue< int > q;
bitset<100005> fol;

void scoate(int x,int y)
{
	grad[x]--;
	grad[y]--;
	
	a[x].pop_front();
	for(list<int>::iterator it=a[y].begin();it!=a[y].end();++it)
		if(*it==x) 
		{
			a[y].erase(it);
			break;
		}
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	
	for(i=1;i<=m;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		
		a[x].push_back(y); grad[x]++;
		a[y].push_back(x);  grad[y]++;
	}
	
	for(i=1;i<=n;++i) 
		if(grad[i]%2)
		{
			printf("-1\n");
			
			fclose(stdin);
			fclose(stdout);
			
			return 0;
		}
	
	q.push(1);
	fol[1]=1;
	
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		
		for( list<int>::iterator it=a[u].begin();it!=a[u].end();++it)
			if(!fol[*it])
			{
				fol[*it]=1;
				q.push(*it);
			}
	}
	
	for(i=1;i<=n;++i) 
		if(!fol[i]) 
		{
			printf("-1\n");
			
			fclose(stdin);
			fclose(stdout);
			
			return 0;
		}
	
	r[++r[0]]=1;

	while(r[0]>0)
	{
		int u=r[r[0]];
		if(!grad[u]) 
		{
			rez.push_back(u);
			r[0]--;
		}
		else 
		{
			int fiu=a[u].front();
			scoate(u,fiu);
			r[++r[0]]=fiu;
		}
	}
	
	rez.pop_back();
	while(!rez.empty())
	{
		printf("%d ",rez.front());
		rez.pop_front();
	}
	printf("\n");
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}