Cod sursa(job #613444)

Utilizator balakraz94abcd efgh balakraz94 Data 26 septembrie 2011 12:15:59
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<bitset>
#define infile "ciclueuler.in"
#define outfile "ciclueuler.out"
#define n_max 100005
#define FOR(v, it) \
	for(vector<int> :: iterator it = v.begin(); it!=v.end(); ++it)
using namespace std;

void afiseaza(int);
int conex();

vector <int> g[n_max];

stack <int> S;

int n;


void citeste()
{
	freopen(infile,"r",stdin);
	
	int m, x, y;
	
	scanf("%d %d",&n,&m);
	
	while(m--)
	{
		scanf("%d %d",&x,&y);
		
		g[x].push_back(y);
		g[y].push_back(x);
	}
	
	fclose(stdin);
}


int grade_pare()
{
	for(int i=1;i<=n;i++)
		if( g[i].size() & 1)
			return 0;
	return 1;
}


int eulerian()
{	
	return grade_pare() &&  conex();
}



int conex()
{
	queue <int> q;
	
	bitset <n_max> uz;
	
	int x, y, c;
	
	for(q.push(c = 1), uz.set(1); !q.empty() && c<n; q.pop())
		FOR(g[x = q.front()], it)
			if(!uz[y = *it])
			{
				c++;
				uz.set(y);
				q.push(y);
			}
	return n == c;		
}


void rezolva()
{
	if(!eulerian())
	{
		afiseaza(-1);
		return;
	}
	
	S.push(1);
	
	int x,y;
	
	while (!S.empty())
	{
		x = S.top();
		
		if(g[x].size())
		{
			y = g[x].back();
			
			S.push(y);
			
			g[x].pop_back();
			
			FOR(g[y],it)
				if(x == *it)
				{
					g[y].erase(it);
				    break;
				}
			continue;
		}
		
		S.pop();
		
		if(!S.empty())
			afiseaza(x);
	}
}



void afiseaza(int x)
{
	printf("%d ",x);
}



int main()
{
	freopen(outfile,"w",stdout);
	
	citeste();
	rezolva();
	
	fclose(stdout);
	
	return 0;
}