Cod sursa(job #821561)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 22 noiembrie 2012 15:25:07
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<iostream>
#include<fstream>
using namespace std;

#define NMAX 100001

struct nod {
	int info;
	nod *urm;
};
typedef nod* PNOD;

ofstream g("ciclueuler.out");

PNOD prim[NMAX];
int viz[NMAX],gr[NMAX],n;

void adauga(PNOD p, int y)
{
	PNOD aux;
	aux=new nod;
	aux->info=y;
	aux->urm=p->urm;
	p->urm=aux;
}

void sterge(PNOD p)
{
	PNOD aux;
	aux=p->urm;
	p->urm=aux->urm;
	delete aux;
}

PNOD cauta(PNOD p, int x)
{
	while(p->urm->info!=x)
		p=p->urm;
	return p;
}

void citire()
{
	int m,x,y,i;
	ifstream f("ciclueuler.in");
	f>>n>>m;
	for(i=1;i<=n;i++) {
		prim[i]=new nod;
		prim[i]->urm=NULL;
	}
	for(i=1;i<=m;i++) {
		f>>x>>y;
		gr[x]++;
		gr[y]++;
		adauga(prim[x],y);
		adauga(prim[y],x);
	}
	f.close();
}

void euler(int nod, bool opt) 
{	
	int x;
	for(PNOD p=prim[nod];p->urm!=NULL; ) {
		x=p->urm->info;
		sterge(p);
		sterge(cauta(prim[x],nod));
		euler(x,true);
	}
	if(opt==true)
		g<<nod<<" ";
}

void dfs(int nod)
{
	viz[nod]=1;
	for(PNOD p=prim[nod]->urm;p!=NULL;p=p->urm)
		if(viz[p->info]==0)
			dfs(p->info);
}

int main()
{
	int i;
	citire();
	dfs(1);
	for(i=1;i<=n;i++)
		if(viz[i]==0 || gr[i]%2==1)
			break;
	if(i>n)
		euler(1,false);
	else g<<"-1";
	g.close();
	return 0;
}