Pagini recente » Cod sursa (job #914425) | Cod sursa (job #2128856) | Cod sursa (job #254793) | Cod sursa (job #2422081) | Cod sursa (job #586813)
Cod sursa(job #586813)
#include <stdio.h>
int n,m,gr[100001],i,ok,luat[100001],sol[600004],x,y,q[100011];
struct nod{int y; nod *next;};
nod *G[100001];
void add(int x,int y)
{
nod *nou=new nod;
nou->y=y;
nou->next=G[x];
G[x]=nou;
}
int dfs(int x)
{
int i=1;
q[0]=0;
q[++q[0]]=x;
while (i<=q[0])
{
nod *nou=new nod;
nou=G[q[i]];
while (nou)
{
if (!luat[nou->y])
{
luat[nou->y]=1;
q[++q[0]]=nou->y;
}
nou=nou->next;
}
i++;
}
return 0;
}
int caut(int v)
{
while (1)
{
nod *nou=new nod;
if (gr[v]==0) break;
int w=G[v]->y;
gr[v]--;
gr[w]--;
if (gr[v])
G[v]=G[v]->next;
else G[v]=NULL;
if (G[w]->y==v)
{
nou=G[w];
if (gr[w])
G[w]=G[w]->next;
else G[w]=NULL;
delete nou;
}
else
{
nou=G[w]->next;
nod *pre=new nod;
pre=G[w];
while (nou->y!=v)
{
pre=pre->next;
nou=nou->next;
}
pre->next=nou->next;
delete nou;
}
sol[++sol[0]]=v;
v=w;
}
return 0;
}
int eulerian()
{
for (i=1;i<=n;i++)
if (gr[i]%2==1) return 0;
luat[1]=1;
dfs(1);
for (i=1;i<=n && ok;i++)
if (!luat[i])
return 0;
return 1;
}
int main(void)
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
gr[x]++;
gr[y]++;
}
if (!eulerian() || 1)
{
printf("-1\n");
return 0;
}
caut(1);
for (i=1;i<=m;i++)
printf("%d ",sol[i]);
printf("\n");
return 0;
}