Cod sursa(job #769492)

Utilizator juliussSimion Stefan juliuss Data 19 iulie 2012 16:32:58
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <list>
#include <stack>
#include <fstream>
#include <bitset>
#include <queue>

using namespace std;

list <int> v[100001], a;
int noduri, muchii, x, y, grade[100001], start;
bitset <100001> vizitat;
queue <int> coada;
stack <int> stiva;

inline void BF(int);
inline int Conex();
inline void Sterge(int, int);
inline void Euler(int);

int main(void)
{
	int i;

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

	for(int i = 0; i < muchii; i++)
	{
		f >> x >> y;
		v[x].push_back(y);
		v[y].push_back(x);
		grade[x]++;
		grade[y]++;
	}

	f.close();
	
	if(Conex() == 1)
	{
		start = 1;
		do
		{
			Euler(start);
			start = stiva.top();
			stiva.pop();
			a.push_front(start);
		}
		while(stiva.empty() == 0);

		for(list<int>::iterator i = a.begin(); i != a.end(); i++)
			g << *i << " ";
	}
	else
		g << -1;

	g.close();
	return 0;
}

inline void BF(int nod)
{
	int nodAuxiliar;

	coada.push(nod);
	vizitat[nod] = 1;
	
	while(coada.empty() == false)
	{
		nodAuxiliar = coada.front();

		for(list<int>::iterator i = v[nodAuxiliar].begin(); i != v[nodAuxiliar].end(); i++)
		{
			if(vizitat[*i] == 0)
			{
				vizitat[*i] = 1;
				coada.push(*i);
			}
		}

		coada.pop();
	}
}
inline int Conex()
{
	int i;

	for(i = 1; i <= noduri; i++)
		if(grade[i] & 1 == 1)
			return 0;

	BF(1);

	for(i = 1; i <= noduri; i++)
		if(vizitat[i] == 0)
			return 0;

	return 1;
}
inline void Sterge(int x, int y)
{
	for(list<int>::iterator i = v[x].begin(); i != v[x].end(); i++)
	{
		if(*i == y)
		{
			v[x].erase(i);
			return;
		}
	}
}
inline void Euler(int nod)
{
	int x;
	while(v[nod].empty() == 0)
	{
		x = v[nod].front();
		stiva.push(nod);
		v[nod].pop_front();
		Sterge(x, nod);
		nod = x;
	}
}