Pagini recente » Cod sursa (job #1949515) | Cod sursa (job #310707) | Cod sursa (job #2384888) | Cod sursa (job #3276208) | Cod sursa (job #680419)
Cod sursa(job #680419)
#include<stdio.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
typedef struct nod { int x; nod *urm; }NODE;
NODE *v[100010];
int n,m,grad[100010],c[300010],viz[100010],ok=1,nr;
FILE *g=fopen("ciclueuler.out","w");
int st[100010],top,sol[100010],sus;
void citire()
{
ifstream f("ciclueuler.in");
f>>n>>m;
int x,y;
NODE *q;
for(int i=0;i<m;++i)
{
f>>x>>y;
q=(NODE*)malloc(sizeof(NODE));
q->x=y;
q->urm = v[x];
v[x]=q;
q=(NODE*)malloc(sizeof(NODE));
q->x=x;
q->urm=v[y];
v[y]=q;
grad[x]++;
grad[y]++;
}
}
int bfs()
{
int p,u;
NODE *q;
p=u=0;
c[0]=1; ++nr;
viz[1]=1;
while(p<=u)
{
q=v[c[p]];
while(q)
{
if(!viz[q->x])
{
viz[q->x]=1;
c[++u]=q->x;
++nr;
}
q=q->urm;
}
++p;
}
if(nr==n) return 1;
return 0;
}
int verif()
{
if(bfs())
{
for(int i=1;i<=n;++i)
if(grad[i]%2==1) return 0;
return 1;
}
return 0;
}
void sterge(int u, int w)
{
NODE *q,*t;
q=v[u];
q=q->urm;
v[u]=q;
q=v[w];
if(q->x==u) v[w]=q->urm;
else while(q->urm)
{
if(q->urm->x==u)
{
q->urm=q->urm->urm;
break;
}
q=q->urm;
}
}
void euler(int u)
{
NODE *q;
while(true)
{
q=v[u];
if(q==NULL) break;
int w=q->x;
st[++top]=u;
sterge(u,w);
u=w;
}
}
void rezolva()
{
int u=1;
sol[++sus]=1;
do
{
euler(u);
u=st[top--];
sol[++sus]=u;
}while(top);
}
int main()
{
citire();
if(verif()==0) fprintf(g,"-1");
else
{
rezolva();
for(int i=1;i<sus;++i)
fprintf(g,"%d ",sol[i]);
}
fclose(g);
return 0;
}