Cod sursa(job #469558)

Utilizator ooctavTuchila Octavian ooctav Data 8 iulie 2010 12:04:57
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <vector>
using namespace std;

const int NMAX = 100005;
const int MMAX = 500005;

int N, M;
list<int> Graf[NMAX];
list<int> ord;
vector<bool> viz;
stack<int> stiva;

void citire()
{
	int x, y;
	cin >> N >> M;
	for(int i = 1 ; i <= M ; i++)
	{
		cin >> x >> y;
		Graf[x].push_back(y);
		Graf[y].push_back(x);
	}
}

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

bool eulerian()
{
	BFS(1);
	for(int i = 1 ; i <= N ; i++)
		if(Graf[i].size() % 2 == 1 || !viz[i])
			return 0;
	return 1;
}

void sterge(int x, int y)
{
	Graf[x].pop_front();
	for(list<int> :: iterator itl = Graf[y].begin() ; itl != Graf[y].end() ; itl++)
		if(*itl == x)
		{
			Graf[y].erase(itl);
			break;
		}
}

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

bool rezolva()
{
	if(eulerian() == 0)
		return 0;
	stiva.push(1);
	do
	{
		ciclu(stiva.top());
		ord.push_back(stiva.top());
		stiva.pop();
	}while(!stiva.empty());
	
	return 1;
}

void scrie(int x)
{
	if(x == 0)
		printf("-1");
	else
	{
		ord.pop_back();
		for(list<int> :: iterator itl = ord.begin() ; itl != ord.end() ; itl++)
			printf("%d ", *itl);
	}
	printf("\n");
}

int main()
{
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	citire();
	scrie(rezolva());
	return 0;
}