Cod sursa(job #783812)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 4 septembrie 2012 09:48:25
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <stack>

using namespace std;

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

const int MAXN = 100010;

list <int> Graf[MAXN], Sol;
queue <int> Q;
stack <int> S;

int N, M, Grad[MAXN];
bool Viz[MAXN];

inline void BFS (int nod)
{
	list <int> :: iterator it;
	Q.push (nod);
	Viz[nod] = 1;
	
	while (!Q.empty ()){
		nod = Q.front ();
		Q.pop ();
		
		for (it = Graf[nod].begin ();  it != Graf[nod].end (); ++ it)
			if (!Viz[*it]){
				Q.push (*it);
				Viz[*it] = 1;
			}
	}
}

inline bool conex ()
{
	int nod;
	
	BFS (1);
	
	for (nod = 2; nod <= N; nod ++)
		if (!Viz[nod])
			return 0;
		
	return 1;
}

inline bool eulerian ()
{
	int nod;
	
	if (!conex ())
		return 0;
	
	for (nod = 1; nod <= N; nod ++)
		if (Grad[nod] & 1)
			return 0;
		
	return 1;
}

inline void sterge (int S, int D)
{
	list <int> :: iterator it;
	
	-- Grad[S], -- Grad[D];
	Graf[S].pop_front ();
	
	for (it = Graf[D].begin (); it != Graf[D].end (); ++ it)
		if (*it == S){
			Graf[D].erase (it);
			
			return;
		}
}

inline void euler (int nod)
{
	int nod2;
	
	while (1){
		if (Graf[nod].empty ())
			return;
		
		nod2 = Graf[nod].front ();
		S.push (nod);
		sterge (nod, nod2);
		nod = nod2;
	}
}

inline bool rez ()
{
	int nod = eulerian ();
	
	if (!nod)
		return 0;
	
	do{
		euler (nod);
		nod = S.top ();
		S.pop ();
		Sol.push_front (nod);
	}while (!S.empty ());
	
	return 1;
}
	
int main ()
{
	list <int> :: iterator it;
	int x, y;
	
	in >> N >> M;
	
	while (M --){
		in >> x >> y;
		
		Graf[x].push_back (y); ++ Grad[x];
		Graf[y].push_back (x); ++ Grad[y];
	}
	
	if (!rez ()){
		out << -1;
		
		return 0;
	}
	
	for (it = Sol.begin (); it != Sol.end (); ++ it)
		out << *it << " ";
	
	return 0;
}