Pagini recente » Cod sursa (job #616720) | Cod sursa (job #2355187) | Cod sursa (job #94668) | Cod sursa (job #2215728) | Cod sursa (job #1572984)
#include <iostream>
#include <fstream>
using namespace std;
struct lst
{
lst *prec[2],*urm[2];
int id[2],sl;
};
struct nod
{
int grad;
lst *orig,*spot,*p,*ort;
}v[100002];
fstream f,g;
lst *elem,*buc;
lst *prez;
int n,m,i,j,t;
lst *k,*l,*o;
void realoc()
{
//cout<<elem->id[0]<<' '<<elem->id[1]<<'\n';
//if(buc->prec[0]==v[i].p)cout<<"da";
buc->prec[0]->urm[buc->prec[0]->id[1]==buc->id[0]]=buc->urm[0];
buc->prec[1]->urm[buc->prec[1]->id[1]==buc->id[1]]=buc->urm[1];
buc->urm[0]->prec[buc->urm[0]->id[1]==buc->id[0]]=buc->prec[0];
buc->urm[1]->prec[buc->urm[1]->id[1]==buc->id[1]]=buc->prec[1];
buc->prec[0]=elem;
buc->urm[0]=elem->urm[0];
elem->urm[0]->prec[0]=buc;
elem->urm[0]=buc;
elem=buc;
//if(v[buc->id[buc->id[0]!=i]].p->urm[0]==buc)cout<<"da";
}
void inaintare()
{
buc=v[i].p->urm[0];
//cout<<buc->id[0]<<' '<<buc->id[1]<<'\n';
//if(v[i].grad>-300)cout<<i<<" are grad "<<v[i].grad<<'\n';
if(v[buc->id[0]].spot==NULL)
{
v[buc->id[0]].spot=new lst;
v[buc->id[0]].spot->prec[0]=prez->prec[0];
v[buc->id[0]].spot->urm[0]=prez;
prez->prec[0]->urm[0]=v[buc->id[0]].spot;
prez->prec[0]=v[buc->id[0]].spot;
v[buc->id[0]].spot->id[0]=buc->id[0];
}
if(v[buc->id[1]].spot==NULL)
{
v[buc->id[1]].spot=new lst;
v[buc->id[1]].spot->prec[0]=prez->prec[0];
v[buc->id[1]].spot->urm[0]=prez;
prez->prec[0]->urm[0]=v[buc->id[1]].spot;
prez->prec[0]=v[buc->id[1]].spot;
v[buc->id[1]].spot->id[0]=buc->id[1];
}
v[buc->id[0]].grad--;
v[buc->id[1]].grad--;
if(v[buc->id[0]].grad==0)
{
v[buc->id[0]].spot->prec[0]->urm[0]=v[buc->id[0]].spot->urm[0];
v[buc->id[0]].spot->urm[0]->prec[0]=v[buc->id[0]].spot->prec[0];
v[buc->id[0]].spot=NULL;
}
if(v[buc->id[1]].grad==0)
{
v[buc->id[1]].spot->prec[0]->urm[0]=v[buc->id[1]].spot->urm[0];
v[buc->id[1]].spot->urm[0]->prec[0]=v[buc->id[1]].spot->prec[0];
v[buc->id[1]].spot=NULL;
}
realoc();
elem=buc;
i=elem->id[i==elem->id[0]];
elem->sl=i;
v[i].ort=elem;
}
int main()
{
f.open("ciclueuler.in",ios_base::in);
g.open("ciclueuler.out",ios_base::out);
f>>n>>m;
for(i=1;i<=n;i++)
{
v[i].p=new lst;
v[i].p->urm[0]=v[i].p;
v[i].p->prec[0]=v[i].p;
v[i].p->id[0]=i;
v[i].p->id[1]=0;
}
for(i=1;i<=m;i++)
{
elem=new lst;
f>>elem->id[0]>>elem->id[1];
v[elem->id[0]].p->prec[0]->urm[elem->id[0]==v[elem->id[0]].p->prec[0]->id[1]]=elem;
elem->urm[0]=v[elem->id[0]].p;
elem->prec[0]=v[elem->id[0]].p->prec[0];
v[elem->id[0]].p->prec[0]=elem;
v[elem->id[1]].p->prec[0]->urm[elem->id[1]==v[elem->id[1]].p->prec[0]->id[1]]=elem;
elem->urm[1]=v[elem->id[1]].p;
elem->prec[1]=v[elem->id[1]].p->prec[0];
v[elem->id[1]].p->prec[0]=elem;
v[elem->id[0]].grad++;
v[elem->id[1]].grad++;
}
prez=new lst;
prez->urm[0]=prez;
prez->prec[0]=prez;
lst *sol=new lst;
sol->urm[0]=sol;
sol->prec[0]=sol;
i=1;
elem=sol;
inaintare();
while(i!=1)inaintare();
while(prez->urm[0]!=prez)
{
j=prez->urm[0]->id[0];
elem=v[j].ort;
i=j;
inaintare();
while(i!=j)inaintare();
}
for(elem=sol->urm[0];elem!=sol;elem=elem->urm[0])g<<elem->sl<<' ';
}