Cod sursa(job #1364295)
Utilizator | Data | 27 februarie 2015 16:37:33 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.9 kb |
#include<fstream>
using namespace std;
struct nod
{
int x;
nod *st,*dr,*adr;
};
nod *p,*PR[100002],*UL[100002];
void elimin1(nod *x,int v1)
{
if(x->st==0)
{
PR[v1]=PR[v1]->dr;
if(PR[v1]==0)
{
UL[v1]=0;
}
else
{
PR[v1]->st=0;
}
delete x;
}
else
{
if(x->dr==0)
{
UL[v1]=UL[v1]->st;
if(UL[v1]==0)
{
PR[v1]=0;
}
else
{
UL[v1]->dr=0;
}
delete x;
}
else
{
((x->st)->dr)=x->dr;
((x->dr)->st)=x->st;
delete x;
}
}
}
void elimin(nod *p,nod *q)
{
int v1,v2;
v1=(p->adr)->x;
v2=(q->adr)->x;
elimin1(p,v1);
elimin1(q,v2);
}
int n,m,x,y,i,j,deg1[100002],deg[100002],m1,ok,ncc,ndd,cc[500009],dd[500009];
int main()
{
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
if(x==y)
{
deg1[x]++;
}
else
{
deg[x]++;
deg[y]++;
p=new nod;
p->x=y;
p->dr=0;
p->st=UL[x];
if(PR[x]==0)
{
PR[x]=p;
UL[x]=p;
}
else
{
UL[x]->dr=p;
UL[x]=p;
}
p=new nod;
p->x=x;
p->dr=0;
p->st=UL[y];
if(PR[y]==0)
{
PR[y]=p;
UL[y]=p;
}
else
{
UL[y]->dr=p;
UL[y]=p;
}
UL[x]->adr=UL[y];
UL[y]->adr=UL[x];
}
}
m1=0;
for(i=1;i<=n;i++)
{
m1=m1+deg[i];
}
m1=m1/2;
ok=1;
for(i=1;i<=n;i++)
{
if(deg[i]!=0)
{
break;
}
}
if(i>n)
{
ok=0;
}
else
{
cc[1]=i;
ncc++;
do
{
p=PR[cc[ncc]];
if(p==0)
{
ok=0;
break;
}
else
{
deg[cc[ncc]]--;
deg[p->x]--;
m1--;
cc[ncc+1]=p->x;
ncc++;
elimin(p->adr,p);
}
}while(cc[ncc]!=cc[1]);
while(m1!=0 && ok==1)
{
for(i=1;i<=ncc;i++)
{
if(deg[cc[i]]!=0)
{
break;
}
}
if(i>ncc)
{
ok=0;
break;
}
else
{
dd[1]=cc[i];
ndd=1;
do
{
p=PR[dd[ndd]];
deg[dd[ndd]]--;
deg[p->x]--;
m1--;
ndd++;
dd[ndd]=p->x;
elimin(p->adr,p);
}while(dd[ndd]!=dd[1]);
}
for(j=ncc;j>=i+1;j--)
{
cc[j+ndd-1]=cc[j];
}
for(j=2;j<=ndd;j++)
{
cc[i+j-1]=dd[j];
}
ncc=ncc+ndd-1;
}
}
if(ok==0)
{
fout<<"-1";
}
else
{
for(i=1;i<ncc;i++)
{
fout<<cc[i]<<" ";
while(deg1[cc[i]]!=0)
{
fout<<cc[i]<<" ";
deg1[cc[i]]--;
}
}
}
fin.close();
fout.close();
return 0;
}