Cod sursa(job #755392)

Utilizator geniucosOncescu Costin geniucos Data 5 iunie 2012 16:24:42
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<cstdio>
#include<vector>
using namespace std;
int m1,l,x,y,i,n,m,ul,v,ap[500002];
vector < int > h[100002];
vector < int > ::iterator it;
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
m1=m;
for(i=1;i<=m;i++)
{
	scanf("%d",&x);
	scanf("%d",&y);
	if(x!=y)
	{
		h[x].push_back(y);
		h[y].push_back(x);
	}
	else
	{
		ap[x]++;
		m1--;
	}
}
for(i=1;i<=n;i++)
	if(h[i].size()%2==1)
	{
		printf("-1\n");
		return 0;
	}
l=1;
ul=1;
/*for(i=1;i<=n;i++)
	{
		printf("%d: ",i);
		for(it=h[i].begin();it!=h[i].end();it++)
			printf("%d ",*it);
		printf("\n");
	}
	printf("\n\n");*/
while(l<=m)
{
	if(l==1)
	{
		ul=1;
		printf("1 ");
		if(ap[1]>0)
		{
			for(i=1;i<=ap[1];i++)
				printf("1 ");
			ap[1]=0;
			l++;
		}
	}
	else
	if(!h[ul].empty())
	{
		v=h[ul].back();
		printf("%d ",v);
		if(ap[v]>0)
		{
			for(i=1;i<=ap[v];i++)
				printf("%d ",v);
			ap[v]=0;
			l++;
		}
		h[ul].pop_back();
		for(it=h[v].begin();it!=h[v].end();it++)
			if(*it==ul)
			{
				h[v].erase(it);
				break;
			}
		ul=v;
		/*for(i=1;i<=n;i++)
		{
			printf("%d: ",i);
			for(it=h[i].begin();it!=h[i].end();it++)
				printf("%d ",*it);
			printf("\n");
		}
		printf("\n\n");*/
	}
	l++;
}
return 0;
}