Cod sursa(job #1344653)

Utilizator shervladVlad Seremet shervlad Data 16 februarie 2015 21:34:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <stack>
#include <queue>
#include <list>
#include <typeinfo>
#define nmax 100010
#define pb push_back
#define pr(l,it) for(auto it=l.begin();it!=l.end();it++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");

int n,m;

list<int> G[nmax],p;
stack<int> st;
int deg[nmax];
bool viz[nmax];

void citire(){
	in >> n >> m;
	int u,v;
	while(m--){
		in >> u >> v;
		deg[u]++;
		deg[v]++;
		G[v].pb(u);
		G[u].pb(v);
	}
}
void bfs(int i){
	queue<int>  Q;
	Q.push(i);
	while(!Q.empty()){
		int cr=Q.front();
		Q.pop();
		pr(G[cr],it){
			if(!viz[*it])
				viz[*it]=true, Q.push(*it);
		}
	}
}
bool conex(){
	bfs(1);
	FOR(i,2,n) if(!viz[i]) return false;
	return true;
}
bool eulerian(){
	if(!conex()) return false;
	FOR(i,1,n) if(deg[i]%2!=0) return false;
	return true;
}

void sterge(int v,int w){
	G[v].pop_front();
	pr(G[w],it) if(*it==v) {G[w].erase(it); break;}
}

void euler(int v){
	int w;
	while(true){
		if(G[v].empty())
			break;
		w=G[v].front();
		sterge(v,w);
		st.push(v);
		v=w;
	}
}

void res(){
	int v=1;
	do{
		euler(v);
		v=st.top(); st.pop();
		p.pb(v);
	}while(!st.empty());
}

int main(){
	citire();
	if(!eulerian()) {
		out<<-1<<"\n";
		return 0;
	}
	else res();
	for(list<int>::reverse_iterator it=p.rbegin();it!=p.rend();it++){
        out<<*it<<" ";
	}
	return 0;
}