Pagini recente » Cod sursa (job #1931244) | Cod sursa (job #281857) | Cod sursa (job #865208) | Cod sursa (job #2141615) | Cod sursa (job #376149)
Cod sursa(job #376149)
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;
}