Cod sursa(job #623814)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 20 octombrie 2011 20:02:19
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<cstdlib>
using namespace std;
int n,m,grad[100010],sol[500500],nr;
struct Muchie{int nod,poz;bool ok;};
Muchie *G[100010];
bool viz[100010];
ofstream fout("ciclueuler.out");

void Citire()
{
	Muchie aux;
	aux.ok=true;
	int i,x,y;
	ifstream fin("ciclueuler.in");
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{
		G[i]=(Muchie *)realloc(G[i],sizeof(Muchie));
		G[i][0].nod=0;
	}
	for(i=1;i<=m;i++)
	{
		fin>>x>>y;
		
		if(x!=y)
		{
			G[y][0].nod++;
			G[x][0].nod++;
		}
		else
			G[x][0].nod++;
		
		G[y]=(Muchie *)realloc(G[y],(G[y][0].nod+1)*sizeof(Muchie));
		aux.nod=x;
		aux.poz=G[x][0].nod;
		G[y][G[y][0].nod]=aux;
		
		if(x!=y)
		{
			G[x]=(Muchie *)realloc(G[x],(G[x][0].nod+1)*sizeof(Muchie));
			aux.nod=y;
			aux.poz=G[y][0].nod;
			G[x][G[x][0].nod]=aux;
		}
		
		grad[x]++;
		grad[y]++;
	}
	fin.close();
}

void DFS(int x)
{
	int i;
	for(i=1;i<=G[x][0].nod;i++)
	{
		if(!viz[G[x][i].nod])
		{
			viz[G[x][i].nod]=true;
			DFS(G[x][i].nod);
		}
	}
}

bool Conex()
{
	int i;
	for(i=1;i<=n;i++)
		if(grad[i]%2==1)
			return false;
	viz[1]=true;
	DFS(1);
	for(i=1;i<=n;i++)
		if(viz[i]==false)
			return false;
	return true;
}

void Euler(int x)
{
	int i;
	for(i=1;i<=G[x][0].nod;i++)
	{
		if(G[x][i].ok==true)
		{
			G[x][i].ok=false;
			if(G[x][i].nod!=x)
				G[G[x][i].nod][G[x][i].poz].ok=false;
			Euler(G[x][i].nod);
		}
	}
	sol[++nr]=x;
}

void Rezolvare()
{
	nr=0;
	Euler(1);
}

int main()
{
	Citire();
	bool ok=Conex();
	if(!ok)
	{
		fout<<-1<<"\n";
		fout.close();
		return 0;
	}
	else
	{
		int i;
		Rezolvare();
		for(i=1;i<=nr;i++)
			fout<<sol[i]<<' ';
		fout<<"\n";
		fout.close();
	}
	return 0;
}