Cod sursa(job #308810)

Utilizator mihnea_andreiMihnea Andrei mihnea_andrei Data 28 aprilie 2009 17:41:45
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream> 
#define N 100010
#define M 500010

using namespace std;

int nr=0,n,m,x,y,d[N],c[M]; 
int *a[N]; 
int *poz[N];

ofstream out ("ciclueuler.out"); 

void citire () 
{ 
	ifstream in1 ("ciclueuler.in"); 
	in1>>n>>m; 
	while(m--) 
	{ 
		in1>>x>>y; 
		d[x]++; 
		if(x!=y)
			d[y]++; 
	}
	in1.close (); 
}

void aloc () 
{ 
	for(int i=1;i<=n;i++) 
	{ 
		a[i]=new int [1+d[i]]; 
		a[i][0]=0; 
		poz[i]=new int [1+d[i]]; 
		poz[i][0]=0; 
	}
}

void completez () 
{ 
	int aux;
	ifstream in2("ciclueuler.in"); 
	in2>>n>>m; 
	aux=m;
	while (aux--)
	{ 
		in2>>x>>y; 
		a[x][++a[x][0]]=y; 
		if(x!=y) 
		{	
			a[y][++a[y][0]]=x; 
			poz[x][a[x][0]]=a[y][0]; 
			poz[y][a[y][0]]=a[x][0]; 
		}
	}
	in2.close ();
}

void euler (int x) 
{ 
	for(int i=1;i<=a[x][0];i++) 
	{ 
		y=a[x][i]; 
		if(y!=0) 
		{ 
			a[x][i]=0; 
			if(y!=x)
				a[y][poz[x][i]]=0; 
			euler (y); 
		}
	}
	c[++nr]=x;
}

void scrie () 
{ 
	for(int i=1;i<=nr-1;i++) 
		out<<c[i]<<" ";
}

int main () 
{ 
	citire (); 
	aloc(); 
	completez (); 
	euler(1); 
	if(m==nr-1 && c[1]==c[nr]) 
		scrie (); 
	else 
		out<<-1; 
	out.close ();
	return 0; 
}