Cod sursa(job #952953)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 24 mai 2013 16:40:03
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#include <string.h>

using namespace std;

const static int maxnr_noduri = 100001;

int nr_noduri , nr_muchii;
vector <int> graph[maxnr_noduri+1];
vector <int> answer;
stack <int> stiva;
int gradintrare[maxnr_noduri+1];
int gradiesire[maxnr_noduri+1];

bool este_conex(const int & start)
{
	int nod = start;
	queue <int> coada;
	coada.push(nod);
	bool * select = new bool[nr_noduri+1];
	memset(select , false , sizeof(select));
	while (!coada.empty())
	{
		nod = coada.front();
		coada.pop();
		select[nod] = true;
		for (int i = 0;i<graph[nod].size();i++)
			if (!select[graph[nod][i]]) coada.push(graph[nod][i]);
	}

	bool ok = true;

	for (int i = 1;i<=nr_noduri;i++)
		if (!select[nr_noduri]) 
		{
			ok = false;
			break;
		}
	delete[] select;
	return ok;
}

bool este_eulerian()
{
	for (int i = 1;i<=nr_noduri;i++)
		if ((gradintrare[i] + gradiesire[i]) % 2 == 1) return false;
	return true;
}


int delete_edge(const int & nod1 , const int & nod2)
{

	graph[nod1].erase(graph[nod1].begin());

	vector<int>::iterator it;
	for (it = graph[nod2].begin();it != graph[nod2].end();it++)
	{
		if (*it == nod1)
		{
			graph[nod2].erase(it);
			break;
		}
	}
}

void euler(int nod)
{
	do{
		int pnod = nod;
		while(!graph[pnod].empty())
		{
			int aux = graph[pnod].front();
			stiva.push(pnod);
			delete_edge(pnod , aux);
			pnod = aux;
		}
		nod = stiva.top();
		stiva.pop();
		answer.push_back(nod);
		
	}while ( !stiva.empty() );
}

void read_data()
{
	ifstream input("ciclueuler.in");
	input >> nr_noduri >> nr_muchii;
	int a , b ;
	for (int i = 0;i<nr_muchii;i++)
	{
		input >> a >> b;
		graph[a].push_back(b);
		graph[b].push_back(a);
		gradiesire[a]++;
		gradintrare[b]++;
	}
	input.close();
}

int main()
{
	ofstream output("ciclueuler.out");
	read_data();
	if (!este_conex(1) || !este_eulerian() ) 
	{
		output << "-1";
		return 0;
	}
	euler(1);
	for (int i = answer.size()-1;i>=0;i--)
		output << answer[i] << " ";
	return 0;
}