Cod sursa(job #631675)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 9 noiembrie 2011 15:38:06
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 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[500000],aux[500000],m;

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();
        v[aux[j]].remove(x);
	    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;
		    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);
	}
	aux[1] = 1;
	merg(1);
	m = j;
	for (i=1;i<=m;++i)
		eul[i] = aux[i];
	adaug();

	return 0;
}