Cod sursa(job #419039)

Utilizator laserbeamBalan Catalin laserbeam Data 16 martie 2010 21:05:46
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
// Catalin Balan
// Tue Mar 16 17:21:56 EET 2010
// Ciclu Eulerian

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>

using namespace std;

#define NMAX 100005
#define CHUNK 8192

#define FIN "ciclueuler.in"
#define FOUT "ciclueuler.out"

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get()
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
	}
	return x;
}

int n,m;
vector<int> G[NMAX];
queue<int> Q;
stack<int> S;
bitset<NMAX> viz;

bool eulerianGraph()
{
	for (int i = 1; i <= n; ++i)
		if ((G[i].size() & 1) == 1) return false;
	
	Q.push(1);
	viz[1] = 1;
	int nod;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
		{
			if (viz[*it]) continue;
			viz[*it] = 1;
			Q.push(*it);
		}
	}

	if (viz.count() == n) return true;
	return false;
	
}

void deleteEdge( int a, int b)
{
	G[a].pop_back();
	G[b].erase( find(G[b].begin(), G[b].end(), a) );
}

void getCycle(int u)
{
	while ( !G[u].empty() )
	{
		S.push(u);
		int v = G[u].back();
		deleteEdge(u,v);
		u = v;
	}
}


void solve()
{
	int u = 1;
	do
	{
		getCycle(u);
		u = S.top();
		S.pop();
		printf("%d ", u);
	} while (!S.empty());
	printf("\n");

}

int main(int argv, char ** argc)
{
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);

	n = get();
	m = get();
	for (; m; --m)
	{
		int x = get();
		int y = get();
		G[x].push_back(y);
		G[y].push_back(x);
	}

	if ( !eulerianGraph() )
	{
		printf("-1\n");
		exit(EXIT_SUCCESS);
	}

	solve();
	
	return EXIT_SUCCESS;
}