Cod sursa(job #376149)

Utilizator titusuTitus C titusu Data 20 decembrie 2009 20:31:41
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
using namespace std;
#include <fstream>
#include <iostream>
#define NN 100005
#define MM 500005
struct nod{
	int info;
	nod * next;
};

nod * G[NN];
int  n,v[NN], d[NN], m, ce[MM];
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

void addMuchie(int i,int j){
	nod *p=new nod;
	p -> info = j;
	p -> next = G[i];
	G[i]=p;
}

void read(){
	int m,i,j;
	fin>>n>>m;
	for( ; m ; --m){
		fin>>i>>j;
		d[i]++;d[j]++;
		addMuchie(i,j); addMuchie(j,i);
	}
}

int toate_pare(){
	for(int i=1;i<=n;i++)
		if(d[i]&1)
			return 0;
	return 1;
}
int conex(){
	int coada[NN],st=1,dr=1,k;
	v[1]=1,coada[1]=1;
	while(st<=dr){
		k=coada[st++];
		for(nod *p=G[k] ; p ; p=p->next)
			if(v[p->info]==0)
				v[p->info]=1, coada[++dr]=p->info;
	}
	for(k=1;k<=n;k++)
		if(v[k]==0 && d[k]!=0)
			return 0;
	return 1;
}

void stergeMuchie(int i,int j){
	//sterg pe j din lista succesorilor lui i
	if(G[i]->info==j)
		G[i]=G[i]->next;
	else{
		nod *p=G[i];
		while(p->next->info!=j)
			p=p->next;
		p->next=p->next->next;
	}
}

void euler(int k){
	while(G[k]){
		int j=G[k]->info;
		G[k]=G[k]->next;
		stergeMuchie(j,k);
		euler(j);
	}
	ce[++m]=k;
}

int main(){
	read();
	if(!conex())
		fout<<-1;
	else
		if(!toate_pare()){
			fout<<-2;
		}
		else{
			int i=1;
			while(d[i]==0)
				i++;
			euler(i);
			for(i=1;i<m;i++)
				fout<<ce[i]<<" ";
			
		}
	
	return 0;
}