Pagini recente » Cod sursa (job #2379659) | Cod sursa (job #1717163) | Cod sursa (job #3032814) | Cod sursa (job #3253181) | Cod sursa (job #632769)
Cod sursa(job #632769)
#include <cstdio>
#define N 100000 + 50
#include <stack>
#include <queue>
using namespace std;
struct nod
{
int inf;
nod *urm;
}*l[N],*rez;
stack< int > S;
queue< int > Q;
int viz[N];
int deg[N];
void add(int x,nod *&p)
{
nod *q= new nod;
q->inf =x;
q->urm =p;
p=q;
}
int n;
int m;
int grad[N];
void read()
{
int x;
int y;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
add(x,l[y]);
add(y,l[x]);
grad[x]++;
grad[y]++;
}
for(int i=1;i<=n;i++)
{
if(grad[i]==0)
viz[i]=1;
}
}
void bfs(int v)
{
Q.push(v);
viz[v]=1;
while(!Q.empty())
{
v=Q.front();
Q.pop();
for(nod *j=l[v];j;j=j->urm)
if(!viz[j->inf])
{
Q.push(j->inf);
viz[j->inf]=1;
}
}
}
int conex()
{
bfs(1);
for(int v=2;v<=n;v++)
{
if(viz[v]==0)
return 0;
}
return 1;
}
int verifEUL()
{
if(conex()==0)
return -1;
for(int i=1;i<=n;i++)
{
if(grad[i]%2==1)
return -1;
}
return 1;
}
void strgp(int v)
{
nod *q=l[v];
l[v]=l[v]->urm;
delete q;
}
void strg(nod *&p)
{
nod *q=p->urm;
p->urm=p->urm->urm;
delete q;
}
void sterge(int v,int w)
{
deg[v]--;
deg[w]--;
strgp(v);
for(nod *j=l[w];j&&j->urm;)
{
if(j->urm->inf==v)
{
strg(j);
}
else
j=j->urm;
}
}
void euler(int v)
{
while(1)
{ if(l[v]==NULL)
break;
int w=l[v]->inf;
S.push(v);
sterge(v,w);
v=w;
}
}
int solve()
{
int v=verifEUL();
if(v==-1)
return -1;
while(!S.empty())
{
euler(v);
v=S.top();
S.pop();
add(v,rez);
}
return 1;
}
void afis(int k)
{
if(k==-1)
{
printf("-1");
}
else
{
for(nod *j=rez;j;j=j->urm)
{
printf("%d ",*j);
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
read();
conex();
S.push(1);
int k=solve();
afis(k);
return 0;
}