Cod sursa(job #1349700)

Utilizator theprdvtheprdv theprdv Data 20 februarie 2015 13:35:56
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

const int maxn = 100005;

int n, m, p[maxn];
vector <int> g[maxn];
vector <int>::iterator it;

void DF(int node)
{
	int i;
	p[node] = 1;
	it = g[node].begin();
	for (i = 0; p[*it + i] && i < g[node].size(); i++);
	if (i < g[node].size() && !p[*it + i])	DF(*it + i);
}
bool eulerian() {
	DF(1);
	for (int i = 1; i <= n; ++i)
		if (g[i].size() % 2 != 0 || !p[i])
			return false;
	return true;
}

inline void euler(int node, ofstream &fout) {
	vector <int> cycle;
	stack <int> st;
	st.push(node);
	while (!st.empty()) {
		int node = st.top();
		if (!g[node].empty()) {
			int newnode = g[node].back();
			g[node].pop_back();
			g[newnode].erase(find(g[newnode].begin(), g[newnode].end(), node));
			st.push(newnode);
		}
		else {
			st.pop();
			if (!st.empty())
				cycle.push_back(node);
		}
	}
	for (vector <int> ::iterator it = cycle.begin(); it != cycle.end(); ++it)
		fout << *it << ' ';
}

int main() {
	ifstream fin("ciclueuler.in");
	ofstream fout("ciclueuler.out");
	fin >> n >> m;
	for (int i = 1; i <= m; ++i) {
		int x, y;
		fin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	if (!eulerian()) {
		fout << "-1\n";
		return 0;
	}
	euler(1, fout);
}