Cod sursa(job #930869)

Utilizator taigi100Cazacu Robert taigi100 Data 27 martie 2013 21:03:07
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<stdio.h>
#include<list>
#include<queue>
#include<stack>
using namespace std;

#define max 100010

list<int> roads[max],resault;
stack<int> S;
queue<int> Q;

int n,m,gr[max],shit[max];

void BFS(int node)
{
	Q.push(node),shit[node]=1;
	while(!Q.empty())
	{
		node=Q.front();Q.pop();
		for(list<int>::iterator it=roads[node].begin();it!=roads[node].end();it++)
			if(shit[*it]==0)
				Q.push(*it),shit[*it]=1;
	}
}
int is_connected()
{
	BFS(1);
	for(int i=2;i<=n;i++)
		if(shit[i]==0)
			return 0;
	return 1;
}

int is_eu()
{
	if(!is_connected)
		return 0;
	for(int i=1;i<=n;i++)
		if(gr[i]%2==1)
			return 0;
	return 1;
}
void erase(int a,int b)
{
	gr[a]--,gr[b]--;
	roads[a].pop_front();
	for(list<int>::iterator it=roads[b].begin();it!=roads[b].end();it++)
		if(*it==a)
		{
			roads[b].erase( it );
			break;
		}
}
void eu(int node)
{
	for(;;)
	{
		if( roads[node].empty() )
			break;
		int sec=roads[node].front();
		S.push(node);
		erase(node,sec);
		node=sec;
	}
}
int solve()
{
     int a=is_eu();
	 if(a==0)
		 return -1;
	 do
	 {
		 eu(a);
		 int q=S.size();
		 a=S.top();
		 S.pop();
		 resault.push_back(a);
	 }while(!S.empty());
	 return 1;
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);

	scanf("%d%d",&n,&m);
	for(;m>0;m--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		roads[x].push_back(y),gr[x]++;
		roads[y].push_back(x),gr[y]++;
	}

	int x=solve();
	if(x==-1)
		printf("-1");
	else
		for(list<int>::reverse_iterator it=resault.rbegin();it!=resault.rend();it++)
			printf("%d ",*it);

	return 0;
}