Mai intai trebuie sa te autentifici.

Cod sursa(job #352679)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 3 octombrie 2009 00:20:59
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;
#define nMax 100010
int n,m;
vector <int> a[nMax];
vector <int> par(nMax,0);
vector <int> rez;
stack <int> st;
int check()
{
	for(int i=1;i<=n;i++)
		if(par[i]%2)
			return 0;
	vector <int> ut(n+1,0);
	st.push(1);
	while(!st.empty())
	{
		int N=st.top();
		st.pop();
		for(vector <int> ::iterator it=a[N].begin();it!=a[N].end();it++)
		{
			if(ut[*it])
				continue;
			ut[*it]=1;
			st.push(*it);
		}
	}
	if(find(ut.begin()+1,ut.end(),0)!=ut.end())
		return 0;
	return 1;
}
void del(int x,int y)
{
	a[x].erase(find(a[x].begin(),a[x].end(),y));
	a[y].erase(find(a[y].begin(),a[y].end(),x));
}
void ciclu(int x)
{
	while(!a[x].empty())
	{
		int y=a[x].front();
		del(x,y);
		st.push(x);
		x=y;
	}
}
void eul()
{
	int x=1;
	do
	{
		ciclu(x);
		x=st.top();
		st.pop();
		rez.push_back(x);
	}while(!st.empty());
	for(int i=0;i<(int)rez.size();i++)
		printf("%d ",rez[i]);
	printf("\n");
}
int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
		a[y].push_back(x);
		par[x]++;par[y]++;
	}
	if(check())
		eul();
	else
		printf("-1\n");
	return 0;
}