Cod sursa(job #1133321)

Utilizator span7aRazvan span7a Data 4 martie 2014 18:54:23
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
struct nod{int inf;nod*leg;};
typedef nod* PNod;
PNod L[100001];
int viz[100001],t[100001],d[100001],ok,n,m,nrsol;//sol[500001];
void add(int x,int y)
{
	PNod p=new nod;
	p->inf=y;
	p->leg=L[x];
	L[x]=p;
}
void citire()
{	int i,x,y;
	f>>n>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		add(x,y);d[y]++;
		add(y,x);d[x]++;
	}
}
void df(int i)
{
	
	viz[i]=1;
	for(PNod p=L[i];p;p=p->leg)
		if(viz[p->inf]==0)
		{
			t[p->inf]=i;
			df(p->inf);
		}
		
}
int verif()
{
	int i;
	for(i=1;i<=n;i++)
		if(viz[i]==0)return 0;
	for(i=1;i<=n;i++)
		if(d[i]%2==1)return 0;
	return 1;
}
void sterge(int x,int y)
{
	PNod q,p;
	for(p=L[x];p;q=p,p=p->leg)
		if(p->inf==y)
			{
				
				q->leg=p->leg;					
				delete p;				
			}
		
}
void euler(int i)
{
	PNod p;
	for(p=L[i];p;p=p->leg)
		if(t[p->inf]!=i&&p->inf!=t[i])
		{
			g<<p->inf<<" ";
			int nodcur=p->inf;
			sterge(i,p->inf);
			sterge(p->inf,i);
			euler(nodcur);
		}
	for(p=L[i];p;p=p->leg)
		{
			g<<t[p->inf]<<" ";
			sterge(i,p->inf);sterge(p->inf,i);
		}
}
/*void afisare()
{
	for(int i=1;i<=nrsol;i++)
		g<<sol[i]<<" ";
		
}*/
int main()
{
	citire();
	df(1);	
	
	ok=verif();
	if(ok==0)
		g<<"-1\n";
	else
	{
		euler(1);
		//afisare();
	}
	
	return 0;
}