Реализация поиска Эйлерова цикла в графе
Сайт: | Информатикс |
Курс: | Алгоритмы на графах |
Книга: | Реализация поиска Эйлерова цикла в графе |
Напечатано:: | Гость |
Дата: | Воскресенье, 3 Август 2025, 06:54 |
Igor Kvasov - 13 Apr 2005
const
maxn = 100;
var
e,was:array[1..maxn,1..maxn]of longint;
ne:array[1..maxn]of longint;
stack:array[1..maxn*maxn]of longint;
i,n,m,u,v,top:longint;
ok:boolean;
begin
read(n,m);
for i:=1 to m do begin
read(u,v);
inc(ne[u]); e[u,ne[u]]:=v;
inc(ne[v]); e[v,ne[v]]:=u;
end;
for i:=1 to n do if ne[i] mod 2=1 then begin
write('No cycle'); exit;
end;
top:=1; stack[1]:=1;
while top>0 do begin
u:=stack[top]; ok:=true;
for i:=1 to ne[u] do begin
v:=e[u,i];
if was[u,v]=0 then begin
inc(top); stack[top]:=v;
was[u,v]:=1;was[v,u]:=1;
ok:=false; break;
end;
end;
if ok then begin
dec(top);
write(u,' ');
end;
end;
end.
Artem Voroztsov - 13 Apr 2005
#include <stdio.h>
#define N 1000
typedef struct item {
struct item *next;
int id;
item(struct item *n, int a): next(n), id(a) {};
} item;
int stack[N];
item *e[N];
int sp=0;
int n;
void
push(int a)
{
stack[sp++] = a;
}
int
pop()
{
if(sp>0)
{
printf("%d ", stack[sp-1] + 1);
return stack[--sp];
} else {
printf("Stack is empty\n");
return -1;
}
}
int last()
{
return stack[sp-1];
}
int walk()
{
int a = last();
if( e[a] != NULL)
{
item *next = e[a];
push (next->id);
next = next->next;
delete ( e[a] );
e[a] = next;
walk();
}
return pop();
}
int main()
{
char buf[1000];
int shift = 0, j=0, i, a, k;
scanf("%d", &n);
memset(e, 0, sizeof(item)*n);
scanf("\n");
for(i=0; i < n; i++)
{
fgets(buf,1000, stdin);
shift = j = 0;
while(sscanf(buf+shift,"%d%n", &a, &k ) == 1)
{
shift += k;
e[i] = new item(e[i], a-1);
j++;
}
}
push(1);
walk();
return 0;
}