Cod sursa(job #941915)

Utilizator forgetHow Si Yu forget Data 20 aprilie 2013 05:35:23
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
using namespace std;

struct edge
{
	int ve;
	list<edge>::iterator it;
};

int main()
{
	ifstream fin("grader_test9.in");
	ofstream fout("ciclueuler.out");
	int n, m;
	fin >> n >> m;
	list<edge> adjl[n+1];
	int u, v;
	list<edge>::iterator it1, it2;
	for (int i = 0; i < m; ++i) {
		fin >> u >> v;
		adjl[u].push_back(edge());
		it1 = --adjl[u].end();
		adjl[v].push_back(edge());
		it2 = --adjl[v].end();
		it1->ve = v, it1->it = it2;
		it2->ve = u; it2->it = it1;
	}

	int circuit[m+1], pos = 0;
	stack<int> s;
	s.push(1);
	while (!s.empty()) {
		u = s.top();
		if (adjl[u].empty()) {
			s.pop();
			circuit[pos++] = u;
		}
		else {
			v = adjl[u].front().ve;
			adjl[v].erase(adjl[u].front().it);
			adjl[u].pop_front();
			s.push(v);
		}
	}

	if (pos == m+1 && circuit[0] == circuit[m])
		for (int i = 0; i < m; ++i)
			fout << circuit[i] << '\n';
	else
		fout << -1;
	return 0;
}