Cod sursa(job #263998)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 21 februarie 2009 10:36:57
Problema Ciclu Eulerian Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#define infile "ciclueuler.in"
#define outfile "ciclueuler.out"
#define nmax (100*1000+1)
#define mmax (1000*1000+1)
struct lista
	{
	int n,p; //nodul si pozitia
	int pl; //pozitia din lista a arcului opus
	char v; //daca a fost vizitat sau nu
	} l[mmax]; //lista
struct nod
	{
	int p,g; //pozitia ultimului fiu din lista, si gradul sau
	} n[nmax]; //nodurile
int nr,mr; //numarul de noduri/muchii

//adaugam muchie intre x si y, la pozitiile m, si m+1
void add(int m, int x , int y)
	{
	l[m].n=y; l[m].p=n[x].p; n[x].p=m; l[m].pl=++m; //adaugam arcul (x,y)
	l[m].n=x; l[m].p=n[y].p; n[y].p=m; l[m].pl=m-1; //adaugam arcul (y,x)
	n[x].g++; n[y].g++; //crestem gradele
	}

void citire()
	{
	int i,x,y;
	scanf("%d %d\n",&nr,&mr);
	for(i=1;i<=mr;i++)
		{
		scanf("%d %d\n",&x,&y); //citim muchia
		add(2*i-1,x,y); //adaugam muchia dintre x si y
		}
	}

void verificare()
	{
	int i;
	for(i=1;i<=nr;i++)
		if(n[i].g%2) //are grad impar
			break; //oprim
	if(i<=nr) printf("-1"); //inseamna ca nu poate forma un ciclu eulerian
	}

void dfs(int x)
	{
	int ul;
	for(ul=n[x].p;ul;ul=l[ul].p) //trecem pe la toti copii lui x
		if(!l[ul].v) //daca nuchia nu a mai fost vizitata
			{
			l[l[ul].pl].v=l[ul].v=1;//vizitam muchia
			dfs(l[ul].n); //parcurgem nodul
			printf("%d ",x); //afisem nodul care face legatura cu muchia
			}
	}

int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire();
verificare();
dfs(1);

fclose(stdin);
fclose(stdout);
return 0;
}