Cod sursa(job #1070319)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 31 decembrie 2013 16:56:18
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <list>
#include<vector>
#include <stack> 
#define pb push_back
#include <queue>
#define TR( C, it ) \
    for( list<int>::iterator it = C.begin(); it != C.end(); it++ )

using namespace std;
const int  nmax = 108000;
list <int> a[nmax],sol;
//vector <int> sol;
stack <int> C;
queue <int> Q;
int n,m,parc[nmax];

void dfs(){
   // parc[nod]=1;
	//for(int i=0;i<a[nod].size();i++)
	int it,nod;
	Q.push(1);
//	for( typeof(a[nod].begin()) it = a[nod].begin(); it != a[nod].end(); it++ ) 
while(!Q.empty()){
	nod = Q.front();Q.pop();
	parc[nod]=1;
TR(a[nod],it)
	 if(parc[*it]!=1)Q.push(*it);	
}

	 
	 
	 //dfs(*it);	
}


int eulerian(){
	dfs();
	for(int i=1;i<=n;i++)
	{
	//	if( parc[i]!=1) return 0;
		if(a[i].size()%2==1)return 0;
	}
	
		for(int i=1;i<=n;i++)
	{
		if( parc[i]!=1) return 0;
	//	if(a[i].size()%2==1)return 0;
	}
	
	
	return 1;
	
}

void parcurgere(int nod){
	
  //for( typeof(a[nod].begin()) it = a[nod].begin(); it != a[nod].end(); it++ ){
 //while(!a[nod].empty()){
 while(true){
 	if(a[nod].empty())break;
 	
 		int it1 = a[nod].front();
  	 C.push(nod);  	
	    
  	 a[nod].pop_front();
   	   TR(a[it1],ib)
  	     if(*ib==nod){
  	     	a[it1].erase(ib); break;
  	     } 	
  	     
  	     nod=it1;
 }
 
 //}
     
 // }
 
  
	
}

void rez(){
	
	if(eulerian()){
	//	C.push(1);
		int w=1;
		do{
		parcurgere(w);
		  w = C.top();
		   C.pop();
		  
		 // if(!a[w].empty()){
		    sol.pb(w);
		  	
		  
		  	
		}while(!C.empty());
	}else sol.pb(-1);
}


int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);	
a[x].pb(y);
//if(y!=x)
a[y].pb(x);
}
rez();
//for(int i=0;i<sol.size();i++)
int it;
TR(sol,it)
printf("%d ", *it);

fclose(stdout); fclose(stdin);
return 0;
}