Pagini recente » Cod sursa (job #1387349) | Cod sursa (job #555472) | Cod sursa (job #3188102) | Cod sursa (job #3257672) | Cod sursa (job #315102)
Cod sursa(job #315102)
#include<stdio.h>
#define NMAX 100003
struct lista {
int x;
lista *next;
};
lista* v[NMAX];
int viz[NMAX],g[NMAX],cic[NMAX],nc=0,ncic=0,n,m;
void adauga(lista* &l,int x) {
lista *q=new lista;
q->x=x;
q->next=l;
l=q;
}
void pop(lista* &l,int &x) {
lista *q=l;
x=q->x;
l=l->next;
delete q;
}
void sterge(int x,int y) {
lista *q=v[x],*pq=NULL;
while(q) {
if(q->x==y) {
if(pq) pq->next=q->next;
else v[x]=q->next;
delete q;
return;
}
pq=q;
q=q->next;
}
}
void citeste() {
int i,x,y;
freopen("ciclueuler.in","r",stdin);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) {
v[i]=NULL;
viz[i]=0;
g[i]=0;
}
for(i=0;i<m;i++) {
scanf("%d %d",&x,&y);
adauga(v[x],y);
adauga(v[y],x);
g[x]++;
g[y]++;
}
fclose(stdin);
}
void dfs(int nod) {
nc++;
viz[nod]=1;
lista *q=v[nod];
while(q) {
if(!viz[q->x]) dfs(q->x);
q=q->next;
}
}
int conex() {
dfs(1);
return nc<n?0:1;
}
int eulerian() {
if(conex()) {
for(int i=1;i<=n;i++)
if(g[i]%2==1) return 0;
return 1;
}
return 0;
}
void euler(int nod) {
int x;
while(v[nod]) {
pop(v[nod],x);
sterge(x,nod);
euler(x);
}
cic[ncic++]=nod;
}
void scrie() {
freopen("ciclueuler.out","w",stdout);
if(eulerian()) {
euler(1);
while(--ncic>0) printf("%d ",cic[ncic]);
}
else printf("%d",-1);
fclose(stdout);
}
int main() {
citeste();
scrie();
return 0;
}