Cod sursa(job #935336)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 3 aprilie 2013 00:14:11
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <string.h>
#include <iomanip>
#include <time.h>
#include <list>
using namespace std;


const string file = "ciclueuler";

const string infile = file + ".in";
const string outfile = file + ".out";


#define NMAX 100003

struct Edge;

list<Edge*> G[NMAX];

struct Edge
{
	int x1;
	int x2;
	list<Edge*>::iterator itr1;
	list<Edge*>::iterator itr2;
	
	void Remove()
	{

		G[x1].erase(itr1);
		G[x2].erase(itr2);

		delete this;
	}
};

int grad[NMAX];
vector<int> eulerCycle;
bool viz[NMAX];
int totalVisited;
int N;
int M;

void citire()
{
	ifstream fin(infile.c_str());

	fin >> N >> M;
	eulerCycle.reserve(M);
	for(int i = 0; i < M; i++)
	{
		int x, y;
		fin >> x >> y;
		Edge *e = new Edge();
		e->x1 = x;
		e->x2 = y;
		e->itr1 = G[x].insert(G[x].begin(), e);
		e->itr2 = G[y].insert(G[y].begin(), e);
		grad[x] ++;
		grad[y] ++;
	}


	fin.close();
}



void DFS(int v)
{
	
	stack<int> nodes;
	nodes.push(v);

	while(nodes.empty() == false)
	{
		int currentNode = nodes.top();
		if(viz[currentNode] == false)
		{
			viz[currentNode] = true;
			++totalVisited;
		}

		if(G[currentNode].size() > 0)
		{
			Edge * edge = G[currentNode].front();

			nodes.push(currentNode == edge->x1 ? edge->x2 : edge->x1);

			edge->Remove();
		}
		else
		{
			eulerCycle.push_back(nodes.top());
			nodes.pop();
		}

	}
			
}


void solve()
{
	ofstream fout(outfile.c_str());
	
	for(int i = 1; i <= N; i++)
	{
		if(grad[i] % 2 == 1)
		{
			fout << "-1\n";
			return;
		}
	}

	DFS(1);

	if(totalVisited != N)
	{
		fout << "-1\n";
		return;
	}

	for(unsigned int i = 0; i < eulerCycle.size() - 1; i++)
	{
		fout << eulerCycle[i] << " ";
	}
	fout << "\n";
	fout.close();

}

void afisare()
{

}

int main()
{

	citire();
	solve();

}