Pagini recente » Cod sursa (job #820472) | Istoria paginii info-oltenia-2018/individual/7-8 | Cod sursa (job #1735821) | Cod sursa (job #3160341) | Cod sursa (job #315997)
Cod sursa(job #315997)
#include<stdio.h>
#define NMAX 100003
#define MMAX 500003
struct lista {
int x;
lista *next;
};
lista *v[NMAX],*s=NULL;
int viz[NMAX],g[NMAX],cic[MMAX],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=1,x;
do {
if(v[nod]) {
pop(v[nod],x);
sterge(x,nod);
adauga(s,nod);
nod=x;
}
else {
cic[ncic++]=nod;
pop(s,nod);
}
} while(s);
}
void scrie() {
freopen("ciclueuler.out","w",stdout);
if(eulerian()) {
euler();
while(ncic-->0) printf("%d ",cic[ncic]);
}
else printf("%d",-1);
fclose(stdout);
}
int main() {
citeste();
scrie();
return 0;
}