Cod sursa(job #532779)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 12 februarie 2011 14:28:54
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#include<list>
#include<stack>
#include<queue>
#define inf "ciclueuler.in"
#define outf "ciclueuler.out"
#define NMax 100100
#define MMax 500100
using namespace std;

fstream f(inf,ios::in),g(outf,ios::out);

int N, M;
int deg[NMax], viz[NMax];
stack<int> S; 
list<int> LA[NMax], C;
list<int>::iterator it;

void read()
{
	f>>N>>M; int a,b;
	for(int i=1; i<=M; i++)
	{
		f>>a>>b;
		deg[a]++; deg[b]++;
		LA[a].push_back(b); LA[b].push_back(a);
	}
}

void BFS(int nod)
{
	queue<int> Q; Q.push(nod); viz[nod] = 1;
	while( !Q.empty() )
	{
		int u = Q.front(); Q.pop();
		for( it=LA[u].begin(); it!=LA[u].end(); it++ )
		{
			int v = (*it);
			if( viz[v] ) continue;
			viz[v] = 1; Q.push(v);
		}
	}
}

bool admite_euler()
{
	BFS(1);
	for(int i=1; i<=N; i++)
		if( !viz[i] ) return false;
	for(int i=1; i<=N; i++)
		if( deg[i]%2 ) return false;
	return true;
}

void sterge(int u,int v)
{
	deg[u]--; deg[v]--;
	LA[u].pop_front();
	for( it=LA[v].begin(); it!=LA[v].end(); it++ )
		if( (*it)==u ) { LA[v].erase(it); return; }
}

void euler(int u)
{
	while(true)
	{
		if( LA[u].empty() ) return;
		int v = LA[u].front();
		S.push(u);
		sterge(u,v);
		u = v;
	}
}

void solve()
{
	if( !admite_euler() ) { g<<"-1"; return; }
	int u = 1;
	do
	{
		euler(u);
		u = S.top(); S.pop();
		C.push_back(u);
	} 
	while( !S.empty() );
	for( it=C.begin(); it!=C.end(); it++ ) g<< (*it) <<" ";
}

int main()
{
	read(); solve();
	f.close(); g.close();
	return 0;
}