Cod sursa(job #485288)

Utilizator darkseekerBoaca Cosmin darkseeker Data 17 septembrie 2010 20:02:38
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <list>
#include <queue>
#include <cstdio>
#define MAXN 100010
#define pb push_back
#define p push
using namespace std;
list<int> v[MAXN];
queue<int> coada;
int g[MAXN],c[MAXN],c1[MAXN],n,m,q;
bool viz[MAXN];
FILE *fin =freopen("ciclueuler.in","r",stdin);
FILE *fout=freopen("ciclueuler.out","w",stdout);
void citeste(void)
{
	int e1,e2,i;
	fscanf(fin,"%d %d",&n,&m);
	for(i=1;i<=m;i++)
	{
		fscanf(fin,"%d %d",&e1,&e2);
		v[e1].pb(e2); g[e1]++;
		v[e2].pb(e1); g[e2]++;
	}
}
void dfs()
{
	coada.push(1);
	list<int>::iterator it;
	while(!coada.empty())
	{
		for(it=v[coada.front()].begin();it!=v[coada.front()].end();it++)
		if(!viz[*it])
		{
			viz[*it]=1;
			coada.p(*it);
		}
		coada.pop();
	}
}
bool este_eulerian()
{
	int i;
	dfs();
	for(i=1;i<=n;i++)
		if(g[i]%2!=0)
			return 0;
	for(i=1;i<=n;i++)
		if(!viz[i])
		return 0;
		return 1;
}
void ciclu()
{
	list<int>::iterator it;
	int i,j,base=1,p;
	c[1]=1;
	do
	{
		base++;
		c[base]=v[c[base-1]].front();
		v[c[base-1]].pop_front();
		for(it=v[c[base]].begin();it!=v[c[base]].end();it++)
			if(*it==c[base-1])
				{
					v[c[base]].erase(it);
					break;
			}
	}while(c[base]!=1);
	p=1;
	for(i=1;i<=base;i++)
		if(!v[c[i]].empty())
		{
			q=i;
			c1[p]=c[i];
			break;
		}
	while(base-1<m)
	{
		do{
			p++;
			c1[p]=v[c1[p-1]].front();
			v[c1[p-1]].pop_front();
			for(it=v[c[p]].begin();it!=v[c[p]].end();it++)
				if(*it==c[p-1])
				{
					v[c[p]].erase(it);
					break;
				}
		}while(c[p]!=c[1]);
		for(i=base;i>=q;i--)
			c[i+p-1]=c[i];
		for(j=2;j<=p;j++)
			c[j+q-1]=c1[j];
		base+=p-1;
	}
}
int main()
{
	citeste();
	if(!este_eulerian())
		fprintf(fout,"%d",-1);
	else
	{
		ciclu();
		for(int i=1;i<=m;i++)
			fprintf(fout,"%d ",c[i]);
	}
	return 0;
}