Cod sursa(job #288813)

Utilizator katakunaCazacu Alexandru katakuna Data 26 martie 2009 09:39:03
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
using namespace std;
#include <cstdio>
#include <list>

#define Nmax 100010

list <int> S, L[Nmax], Sol;
list <int>::iterator it;
int grad[Nmax], x, y, n, m, i, nod, fiu;


void sterge(int x, int y){

	L[x].pop_front();
	list <int>::iterator it;
	for(it = L[y].begin() ; it != L[y].end(); it++)
		if( *it == x ){
			L[y].erase(it);
			break;
		}
	
}


void parc(int nod){

	int v = nod;
	S.push_back(v);
	
	do{
		fiu = L[v].front();
		if(v != nod) S.push_back(v);
		sterge(v, fiu);
		grad[v]--; grad[fiu]--;
		v = fiu;
	}while(v != nod);

}


void euler(){

	Sol.push_back(1);
	list <int>::iterator it, it2, it3;
	int nr = 1;
	
	for(it = Sol.begin(); it != Sol.end();){
		
		if(grad[*it]){
			parc(*it); 		
			
			it2 = it; 
			it3 = it;
			it2++;
			
			if(nr != 1)
				S.push_back(*it);
			
			Sol.insert(it2, S.begin(), S.end());
			
			it3 = it;
			it3++;
			Sol.erase(it);
			it = it3;
			
			S.clear();
			
			nr++;
		}
		
		if( it != Sol.end() && !grad[*it] )
			it++;
	}
}


int BFS(int x){

	int q[Nmax], p = 1, u = 1;
	char viz[Nmax];
	memset(viz, 0, sizeof(viz));
	
	q[1] = x; 
	
	for(; p <= u; p++){
		nod = q[p];
		for(it = L[nod].begin() ; it  != L[nod].end(); it++){
			fiu = *it;
			if( !viz[fiu] ){
				viz[fiu] = 1;
				q[++u] = fiu;
			}
		}				
	}
	
	for(i = 1; i <= n; i++)
		if( !viz[i] && grad[i] )
			return 0;
	
	return 1;
}


int verifica(){
	
	for(i = 1; i <= n; i++)
		if( (grad[i]&1) == 1 )
			return 0;
	
	if( !BFS(1) )
		return 0;

	return 1;
}


int main(){
	
	FILE *f = fopen("ciclueuler.in", "r");
	FILE *g = fopen("ciclueuler.out", "w");

	fscanf(f,"%d %d",&n,&m);
	for(i=1; i<=m; i++){
		fscanf(f,"%d %d",&x, &y);
		grad[x]++; grad[y]++;
		L[x].push_back(y);
		L[y].push_back(x);
	}
	
	//vad daca nodurile au gadul par
	//vad daca e conex
	if( verifica() ){
		euler();
		for(it = Sol.begin(); it != Sol.end(); it++)
			fprintf(g,"%d ",*it);
	}
	
	else
		fprintf(g,"%d",-1);
	
	fclose(f);
	fclose(g);

	return 0;

}