Cod sursa(job #713673)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 14 martie 2012 20:45:58
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream>
#include<vector>
#define NMAX 100010
#define MMAX 1000010

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<int> a[NMAX];
int gr[NMAX], vz[NMAX], ciclu[MMAX], aux[MMAX], n, m;

void Citeste()
{
	int x, y, i;
	f>>n>>m;
	for (i=1; i<=m; ++i)
	{
		f>>x>>y;
		a[x].push_back(y); ++gr[x];
		a[y].push_back(x); ++gr[y];
	}
}

void DFS(int nod)
{
	int i;
	vz[nod]=1;
	for (i=0; i<(int)a[nod].size(); ++i)
		if (!vz[a[nod][i]]) DFS(a[nod][i]);
}

bool BUN()
{
	int i;
	DFS(1);
	for (i=1; i<=n; ++i)
		if (!vz[i] || gr[i]==0 || gr[i]%2==1) return 0;
	return 1;
}

void Cauta(int x, int y)
{
	int i;
	for (i=0; i<(int)a[x].size(); ++i)
		if (a[x][i]==y) {a[x][i]=0;break;}
	for (i=0; i<(int)a[y].size(); ++i)
		if (a[y][i]==x) {a[y][i]=0;break;}
}

void Bucatica(int x)
{
	int i, pr=x;
	--gr[x]; aux[0]=0;
	for (i=0; i<(int)a[x].size(); ++i)
		if (gr[a[x][i]]) 
			{
				x=a[x][i];
				aux[++aux[0]]=x;
				--gr[x];
				Cauta(x, pr);
				break;
			}
	while (gr[x]%2!=0)
	{
		--gr[x];
		for (i=0; i<(int)a[x].size(); ++i)
			if (gr[a[x][i]])
			{
				x=a[x][i];
				Cauta(x, pr);
				break;
			}	
		aux[++aux[0]]=x; --gr[x]; pr=x;
	}
}

void Copie(int pz)
{
	int i, j;
	for (i=ciclu[0], j=ciclu[0]+aux[0]; i>=pz; --i, --j)
		ciclu[j]=ciclu[i];
	for (i=pz, j=1; i<=pz+aux[0]-1; ++i, ++j) ciclu[i]=aux[j];
	ciclu[0]+=aux[0];
}

void Ciclu_Euler()
{
	int i;
	ciclu[1]=ciclu[0]=1;
	Bucatica(1);
	Copie(2);
	for (i=1; i<=ciclu[0]; ++i)
		if (gr[ciclu[i]])
		{
			Bucatica(ciclu[i]);
			Copie(i+1);
			i=i-1;
		}
	g<<ciclu[1];
	for (i=2; i<ciclu[0]; ++i) 
		g<<" "<<ciclu[i];
	g<<"\n";
}

int main()
{
	Citeste();
	if (BUN()) Ciclu_Euler();
	else g<<"-1\n";
	f.close();
	g.close();
	return 0;
}