Cod sursa(job #481612)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 31 august 2010 22:49:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<list>
#define NMAX 100003
#define MMAX 500005

using namespace std;

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

list<int> a[NMAX];
int n, m, ne, nc, i;
int E[MMAX], c[MMAX], viz[NMAX], grad[NMAX];
list<int>::iterator it;

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

void DFS(int nod)
{
    list<int>:: iterator it;
    viz[nod]=1;
    for(it=a[nod].begin(); it!=a[nod].end(); ++it)
        if (!viz[*it]) DFS(*it);
}
void sterge(int y, int x)
{
	for(it=a[y].begin(); it!=a[y].end(); ++it)
		if (*it==x) 
		{
			a[y].erase(it);
			break;
		}
}

void ciclu()
{
	int x, y;
	do
	{
		x=c[nc];
		y=*a[c[nc]].begin();
		a[x].pop_front();
		sterge(y,x);
		++nc;c[nc]=y;
		--grad[x];--grad[y];
	}while(c[1]!=c[nc]);
}

void move(int pos)
{
	int j;
	for (j=ne;j>=pos;j--) E[j+nc-1]=E[j];
    for (j=1;j<=nc-1;j++) E[j+pos]=c[j+1];
	ne+=nc-1;
}

void solve_ciclu()
{
	int i, x, y;
	ne=1;E[ne]=1;
	do
	{
		x=E[ne];
		y=*a[E[ne]].begin();
		a[x].pop_front();
		sterge(y,x);
		++ne;E[ne]=y;
		--grad[y];--grad[x];
	}while(E[ne]!=1);
	while (ne-1<m)
	{
		for (i=1; i<ne; ++i)
			if (grad[E[i]]>0) break;
		c[1]=E[i];nc=1;
		ciclu();
		move(i);
	}
}
	
void solve()
{
	int i, ok=1;
	for(i=1; i<=n; ++i)
		if (viz[i]!=1 || grad[i]%2==1)
		{
			ok=0;
			break;
		}
		
	if (ok) solve_ciclu();
	else g<<"-1\n";
}

int main()
{
	citeste();
	DFS(1);
	solve();
	g<<E[1];
	for (i=2; i<ne; ++i) g<<" "<<E[i];
	g<<"\n";
	f.close();
	g.close();
	return 0;
}