Pagini recente » Cod sursa (job #641063) | Cod sursa (job #806917) | Cod sursa (job #2401679) | Cod sursa (job #1714449) | Cod sursa (job #278020)
Cod sursa(job #278020)
#include <fstream.h>
#define N 100001
#define M 500001
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
struct muchii{int info;
muchii *urm;} *VF[N]; // lista de adiacenta
int n,m,GR[N],st[M],sol[M];
void adauga(muchii *&prim, int y){
muchii *p;
p = new muchii;
p->info = y;
p->urm = prim;
prim = p;
}
void citeste(){
int x,y;
in>>n>>m;
while(in>>x>>y){
//if(x!=y){
adauga(VF[x],y);
adauga(VF[y],x);
//} else adauga(VF[x],y);
// creste gradele nodurilor;
GR[x]++;
GR[y]++;
}
}
int verifica(){
for(int i=1;i<=n;++i)
if(GR[i] % 2 == 1)return 0;
return 1;
}
void elimina(int x, int y) //elimin muchia x,y
{
// sterg prim[x]
muchii *q;
q=VF[x];
VF[x]=VF[x]->urm;
delete(q);
muchii *p,*r;
if(VF[y]->info == x)
{
p=VF[y];
VF[y]=VF[y]->urm;
delete(p);
}
else
for(r=VF[y]; r->urm; r=r->urm)
if(r->urm->info == x)
{
p=r->urm;
r->urm = r->urm->urm;
delete(p);
break;
}
}/*
void elimina(int x,int y){
muchii *p,*q,*r;
p = VF[x];
VF[x] = VF[x]->urm;
delete(p); // sterge y din lista lui x
for(r= VF[y];r;r=r->urm)
if(r->info == x){
q = r;
r = r->urm;
delete(q); //sterge x din y
break;
}
}
*/
void parcurge(){
int vf = 1,k=0;
st[vf] = 1;
while(vf){
if(VF[st[vf]] != NULL){
st[vf+1] = VF[st[vf]]->info;
vf++;
elimina(st[vf-1],st[vf]);
}else{ sol[++k] = st[vf]; vf--;}
}
for(int i=1;i<k;++i)
out<<sol[i]<<" ";
}
void afisare(){
for(int i=1;i<=n;++i){
for(muchii *p=VF[i];p;p=p->urm)
out<<p->info<<" ";
out<<"\n";
}
}
int main(){
citeste();
//elimina(1,3);
//afisare();
if(verifica())
parcurge();
else out<<"-1";
return 0;
}