Cod sursa(job #631844)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 9 noiembrie 2011 20:50:48
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<list>
#include<vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
long n,a,b,j=1,i,eul[500001],aux[500001],m,grad[100001];

list<int> v[10001];
list<int>::iterator it;

int merg(long x)
{   if (v[x].front() != 0)
	{   ++j; 
        aux[j] = v[x].front();
	    v[x].pop_front();
	    it = v[aux[j]].begin();
		while (it != v[aux[j]].end() && *it != x)
			++it;
        v[aux[j]].erase(it);
	    merg(aux[j]);
	}
	return 0;
}
int adaug()
{long ok=0,x;
    while (ok != 1)
	{   ok = 1;
        i = 1;
		while (v[i].front() == 0 && i < n)
			++i;
		if (i == n)
		{   for (i=1;i<=j;++i)
		        fout << eul[i] << " ";
		    return 0;
		}
		else
		{   j = 1;
		    ok =0;
		    aux[1] = i;
			merg(i);
			i = 1;
			while (eul[i] != aux[1] && i <= m)
				++i;
			for (x=1;x<j;++x)
			{	eul[m+x+1] = eul[i+x];
		        eul[i+x] = aux[x+1];
			}
			m = m + j -1;
		}
	}
	return 0;
}

int main()
{   fin >> n >> m;
    for(i=1;i<=n;++i)
		v[i].push_front(0);
	for (i=1;i<=m;++i)
	{   fin >> a >> b;
		v[a].push_front(b);
	    v[b].push_front(a);
		++grad[a];
		++grad[b];
	}
	for (i=1;i<=n;++i)
	    if (grad[i]% 2 == 1)
	    {   fout << -1;
		    return 0;
		}
	aux[1] = 1;
	merg(1);
	m = j;
	for (i=1;i<=m;++i)
		eul[i] = aux[i];
	adaug();

	return 0;
}