Pagini recente » Cod sursa (job #1229370) | Cod sursa (job #1426470) | Cod sursa (job #131061) | Cod sursa (job #2974659) | Cod sursa (job #1575729)
#include <stdio.h>
const int nmax=100001;
const int mmax=500001;
const int NIL=-1;
int head[nmax];
int gr[nmax];
int st[mmax+2];
int sz;
struct element
{
int nod,pereche,next;
};
element buff[2*mmax];
void push(int n1, int n2, int pos, int pereche)
{
buff[pos].nod=n2;
buff[pos].pereche=pereche;
buff[pos].next=head[n1];
head[n1]=pos;
}
void euler(int nod, FILE *f)
{
st[++sz]=nod;///pun nodul cu care incep in stiva
while (sz)///stiva nevida
{
nod=st[sz];///extrag elementul din varf
while ((head[nod] != NIL) && (buff[head[nod]].nod == NIL))///nodul are muchii netraversate si am marcat anumite muchii
head[nod]=buff[head[nod]].next;///sar peste muchiile marcate
if (head[nod] != NIL)///nodul are muchii netraversate
{
st[++sz]=buff[head[nod]].nod;///iau vecinul nodului (cu care acesta formeaza muchii)
buff[buff[head[nod]].pereche].nod=NIL;///marchez ca am traversat vecinul
head[nod]=buff[head[nod]].next;///trec la urmatorul vecin
}
else
{
sz--;///sterg ultimul element din stiva
if (sz)///stiva nevida
fprintf(f,"%d ",nod);///afisez
}
}
}
int main()
{
FILE *f;
int n,m,i,x,y;
bool ok;
f=fopen("ciclueuler.in","r");
fscanf(f,"%d%d",&n,&m);
for (i=1; i<=n; i++)
head[i]=NIL;
for (i=1; i<=m; i++)
{
fscanf(f,"%d%d",&x,&y);
gr[x]++;
push(x,y,2*i-1,2*i);
gr[y]++;
push(y,x,2*i,2*i-1);
}
fclose(f);
f=fopen("ciclueuler.out","w");
ok=true;
for (i=1; i<=n; i++)///nu exista ciclu
if (gr[i] % 2)
ok=false;
if (!ok)
fprintf(f,"-1");
else
euler(buff[1].nod,f);
fclose(f);
}