Cod sursa(job #726315)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 27 martie 2012 10:07:15
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<list>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int i,n,m,x,y,grad[100001],aux[100001],sol[100001],nr,mare;
bool viz[100001];
bool ok;
list <int> v[100001];
inline void df(int k)
{   list<int>::iterator it;
    viz[k] = true; 
    for (it=v[k].begin();it!=v[k].end();++it)
		if (!viz[*it])
			df(*it);
}
inline void dft(int k)
{   if (v[k].size())
    {   list <int>::iterator it;
		aux[++nr] = v[k].front();
        it = v[2].begin();
		v[k].pop_front();
		it = v[aux[nr]].begin();
		while (*it != k)
			++it;
		v[aux[nr]].erase(it);
		dft(aux[nr]);
	}
} 
inline void adaug()
{int j;
	for (i=1;i<=n && sol[i]!=aux[1];++i);
	for (j=1;j<=mare-i+1;++j)
    {   sol[mare+j] = sol[i+j-1];
	    sol[i+j-1] = aux[j];
	}
	mare = mare + nr - 1;
	nr=0;
}
int main()
{   fin >> n >> m;
    for (i=1;i<=m;++i)
	{	fin >> x >> y;
	    v[x].push_back(y);
		v[y].push_back(x);
		++grad[x];
		++grad[y];
    }
	df(1);
	for (i=1;i<=n;++i)
		if (!viz[i] && (grad[i] % 2))
		{	fout << "-1";
	        return 0;
		}
	aux[++nr] = 1;
	dft(1);
	for (i=1;i<=nr;++i)
		sol[i] = aux[i];
	mare = nr;
	nr=0;
	while (!ok)
	{   for (i=1;i<=n && !v[i].size();++i);
	    if (i>=n)
		{	for (i=1;i<mare;++i)
				fout << sol[i] << " ";
		    return 0;
		}
		aux[++nr] = i;
		dft(i);
		adaug();
	}
	return 0;
}