Cod sursa(job #1471948)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 15 august 2015 17:58:06
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <vector>
#include <list>
#include <stack>
#include <fstream>
#include <algorithm>
using namespace std;

class graf{
	vector<list<int> > adiac;
public:
	graf(const int n):
		adiac(n){}
	void add_muc(const int a, const int b){
		adiac[a].push_back(b);
		adiac[b].push_back(a); }
	void rm_muc(const int a, const int b){
		adiac[a].erase(find(begin(adiac[a]), end(adiac[a]), b));
		adiac[b].erase(find(begin(adiac[b]), end(adiac[b]), a)); }
	bool e_eulerian(){
		return all_of(begin(adiac), end(adiac), [](const list<int>& ls){
			return ls.size() % 2 == 0; }); }
	vector<int> fa_ciclu_euler(){
		vector<int> rez;
		stack<int> st;
		st.push(distance(
			begin(adiac), 
			find_if(begin(adiac), end(adiac), [](const list<int>& ls){
				return !ls.empty(); })));
		while(!st.empty()){
			const int cur = st.top();
			if(!adiac[cur].empty()){
				const int next = adiac[cur].front();
				st.push(next);
				rm_muc(cur, next); }
			else{
				st.pop();
				rez.push_back(cur); } }
		return rez; } };

int main(){
	ifstream f("ciclueuler.in");
	ofstream g("ciclueuler.out");
	int n, m;
	f >> n >> m;
	graf gr(n);
	for(int i = 0, a, b; i < m; ++i){
		f >> a >> b;
		gr.add_muc(a-1, b-1); }
	if(gr.e_eulerian()){
		auto ciclu = gr.fa_ciclu_euler();
		ciclu.pop_back();
		for(const auto x : ciclu){
			g << x+1 << ' '; } }
	else{
		g << "-1"; }
	return 0; }