Cod sursa(job #308814)

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

using namespace std;

int nr=0,n,m,x,y,d[N],c[M],stvf[M],stvec[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 euler (int x) 
{ 
	int k=1; 
	stvf[k]=x; 
	stvec[k]=0; 
	while (k) 
	{ 
		x=stvf[k]; 
		if(stvec[k]<a[x][0]) 
		{ 
			y=a[x][++stvec[k]]; 
			if(y==0) 
				continue; 
			a[x][stvec[k]]=0; 
			if(x!=y) 
				a[y][poz[x][stvec[k]]]=0; 
			stvf[++k]=y; 
			stvec[k]=0; 
			continue; 
		}
		c[++nr]=x; 
		k--;
	}
}

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; 
}