Cod sursa(job #760362)

Utilizator cr1st18Cristi cr1st18 Data 21 iunie 2012 01:30:54
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
#include<iostream>
#include<list>
#include<queue>
#include<stack>
#define Nmax 100000
#define pb push_back
#define tryNext(C, it) for(typeof(C.begin()) it = C.begin(); it != C.end(); it++)

using namespace std;

list< int > G[Nmax],L;
stack< int > S;
queue< int > Q;

int deg[Nmax],viz[Nmax];
int n,m;
int i,m1;

// citeste 
void citeste()
{
	int u,v;
	
	scanf("%d %d", &n, &m);
	m1 = m;
	while( m > 0) 
	{
		scanf("%d %d", &u, &v);
		G[u].pb(v); deg[u]++;
		G[v].pb(u); deg[v]++;
	m--;
	}
}
//BFS
void BFS()
{
	int v;
	Q.push(1);
	viz[1] = 1;
	
	while( !Q.empty() )
	{
		v = Q.front(); Q.pop();
		for(list< int >::iterator w = G[v].begin();w != G[v].end();w++)
			if( viz[*w] == 0 )
			{
				Q.push(*w);
				viz[*w] = 1;
			}
	}
}

// verif eulerian 
int eulerian()
{
	BFS();
	for(int i = 1; i<=n;i++)
		if( deg[i]%2 != 0 || viz[i] == 0)
			return 0;
	return 1;
}

//sterge (v,w)
void sterge( int v, int w ) 
{
	deg[v]--; deg[w]--;
	G[v].pop_front();
	tryNext(G[w],it)
		if( *it == v){
			G[w].erase(it);
			break;
		}
}
// ciclu eulerian
void euler( int v ) 
{
	while(true) 
	{
		if(G[v].empty())
			break;
		int w = G[v].front();
		S.push(v);
		sterge(v,w);
		v = w;
	}
}
// uneste cicluri euleriene 

int rez()
{
	int v = eulerian();
	
	if( v == 0 ) 
		return -1;	
	do{
		euler(v);
		v = S.top(); S.pop();
		L.push_back(v);
	}while( !S.empty() );
	
 return 1;
}

void afis()
{
	int i = m1;
	if( rez() == -1)
		printf("-1\n");
	else
	{
		list< int >::iterator it = L.begin();
		while(i--)
		{
			printf("%d\n",*it);
			it++;
		}
	}
}
int main()
{

	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	citeste();
	afis();
		
return 0;
}