Cod sursa(job #1070216)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 31 decembrie 2013 12:45:27
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <list>
#include<vector>
#include <stack> 
#define pb push_back
#define TR( C, it ) \
    for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )

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

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


int eulerian(){
	dfs(1);
	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++ ){
     int it = a[nod].back();
  	 C.push(it);  	 
  	 a[nod].pop_back();
  	   // for( typeof(a[it].begin()) ib = a[it].begin(); ib != a[it].end(); ib++ )
  	   TR(a[it],ib)
  	     if(*ib==nod){
  	     	a[it].erase(ib); break;
  	     }
 // }
 
  
	
}

void rez(){
	
	if(eulerian()){
		C.push(1);
		int w;
		do{
		  w = C.top();
		   C.pop();
		  
		  if(!a[w].empty()){
		    sol.pb(w);
		  	parcurgere(w);
		  }
		  	
		}while(!C.empty());
	}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++)
printf("%d ", sol[i]);

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