Cod sursa(job #1376583)

Utilizator dumitruandrDumitru Andreea dumitruandr Data 5 martie 2015 17:56:37
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include<stdlib.h>
using namespace std;
int **a,n,m,**t,*v,impar,start;
	ifstream f("euler.in");
	ofstream g("euler.out");
void DFS(int x)
{
	v[x]=1;
	v[0]++;
	for(int i=1;i<=a[x][0];i++)
		if(!v[a[x][i]])
		{
			t[x][i]=1;
			for(int j=1;j<=a[a[x][i]][0];j++)
				if(a[a[x][i]][j]==x){
					t[a[x][i]][j]=1;break;}
			DFS(a[x][i]);
		}
}
void euler(int x)
{
	int y=-1;
	for(int i=1;i<=a[x][0];i++)
		if(t[x][i]==0)
		{
			t[x][i]=-1;
			for(int j=1;j<=a[a[x][i]][0];j++)
				if(a[a[x][i]][j]==x&&t[a[x][i]][j]!=-1){
					t[a[x][i]][j]=-1;break;}
			g<<x<<' ';
			euler(a[x][i]);
			return;
		}
		else if(t[x][i]==1)
			y=i;
	if(y!=-1)
	{
		t[x][y]=-1;
		for(int j=1;j<=a[a[x][y]][0];j++)
				if(a[a[x][y]][j]==x){
					t[a[x][y]][j]=-1;break;}
		g<<x<<' ';
		euler(y);
	}
}
int main()
{

	f>>n>>m;
	a=(int **)malloc((n+1)*sizeof(int*));
	t=(int **)malloc((n+1)*sizeof(int*));
	v=(int *)malloc((n+1)*sizeof(int));
	v[0]=0;
	for(int i=1;i<=n;i++)
	{
		a[i]=(int *) malloc(sizeof(int));
		t[i]=(int *) malloc(sizeof(int));
		a[i][0]=0;
		v[i]=0;
	}
	int c,d;
	for(int i=1;i<=m;i++)
	{
		f>>c>>d;
		a[c][0]++;
		a[c]=(int *) realloc(a[c],(a[c][0]+1)*sizeof(int));
		a[c][a[c][0]]=d;
		t[c]=(int *) realloc(t[c],(a[c][0]+1)*sizeof(int));
		t[c][a[c][0]]=0;
		a[d][0]++;
		a[d]=(int *) realloc(a[d],(a[d][0]+1)*sizeof(int));
		a[d][a[d][0]]=c;
		t[d]=(int *) realloc(t[d],(a[d][0]+1)*sizeof(int));
		t[d][a[d][0]]=0;
	}
	for(int i=1;i<=n;i++)
		if(a[i][0]%2==1) impar++,start=i;

	if(impar==0)
		start=1;
	else{ g<<"-1";return 0;}
	DFS(1);
	if(v[0]<n) { g<<"-1";return 0;}
	else
		euler(start);
return 0;}