Cod sursa(job #403769)

Utilizator GotenAmza Catalin Goten Data 25 februarie 2010 11:50:52
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream.h>
int leg[1000100],ver[1000100],start[100010],c[100100],n,in[100100],st[500100],sol[500100];
bool pus[1000100],viz[100100];
int error()
{
	int i;
	for(i=1;i<=n;i++)
		if(in[i]%2)
			return 1;
	int p=1,t;
	c[++c[0]]=1;
	viz[1]=1;
	while(p<=c[0])
	{
		t=start[c[p]];
		while(t)
		{
			if(!viz[ver[t]])
			{
				viz[ver[t]]=1;
				c[++c[0]]=ver[t];
			}
			t=leg[t];
		}
		p++;
	}
	if(c[0]==n)
		return 0;
	return 1;
}
int main()
{
	int i,m,x,y,q=0,t,p=0;
	ifstream f("euler.in");
	ofstream g("euler.out");
	f>>n>>m;
	while(m--)
	{
		f>>x>>y;
		ver[++q]=y;
		leg[q]=start[x];
		start[x]=q;
		ver[++q]=x;
		leg[q]=start[y];
		start[y]=q;
		in[y]++;
		in[x]++;
	}
	if(error())
	{
		g<<"-1";
		return 0;
	}
	q=0;
	st[++q]=1;
	while(q)
	{
		t=start[st[q]];
		if(t)
		{
			start[st[q]]=leg[t];
			if(!pus[t])
			{
				pus[t]=1;
				if(t%2)
					pus[t+1]=1;
				else
					pus[t-1]=1;
				st[++q]=ver[t];
			}
		}
		else
			sol[++p]=st[q--];
	}
	for(i=1;i<p;i++)
		g<<sol[i]<<' ';
	return 0;
}