Virtual Object
::
Programs
:: Эйлеров цикл в неориентированном графе |
||||
Наша кнопка |
||||
Поиск Эйлерового цикла в неориентированном графе {$APPTYPE CONSOLE}
var a:array [1..100,1..100] of boolean; ⁄⁄ матрица смежности
vert:array [1..10000] of longint; ⁄⁄ степень вершин
way:array [1..10000] of longint; ⁄⁄ Эйлеров цикл
flag:array [1..10000] of longint; ⁄⁄ компоненты связности
i,x,y,w:longint;
n,m:longint; ⁄⁄ m - число дуг, n - число вершин
count:longint; ⁄⁄ число компонент связности
⁄⁄---------------------------------------------------
procedure no;
begin
write(′Эйлеров цикл не существует!′);
halt;
end;
⁄⁄---------------------------------------------------
procedure komponenta(i:longint);
var j:longint;
begin
flag[i]:=count;
for j:=1 to n do
if (a[i,j])and(flag[j]=0) then komponenta(j);
end;
⁄⁄---------------------------------------------------
procedure poisk(i:longint);
var j:longint;
begin
for j:=1 to n do
if a[i,j] then
begin
a[i,j]:=false;
a[j,i]:=false;
poisk(j);
end;
inc(w);
way[w]:=i;
end;
⁄⁄---------------------------------------------------
begin
assign(input,′input.txt′);reset(input);
assign(output,′output.txt′);rewrite(output);
fillchar(a,sizeof(a),false);
fillchar(flag,sizeof(flag),0);
fillchar(vert,sizeof(vert),0);
read(n,m);
for i:=1 to m do
begin
readln(x,y);
a[x,y]:=true;
a[y,x]:=true;
inc(vert[x]);
inc(vert[y]);
end;
count:=0;
for i:=1 to n do
if flag[i]=0 then
begin
inc(count);
if count>1 then no; ⁄⁄ граф не связен
komponenta(i);
end;
for i:=1 to n do
if vert[i] mod 2=1 then no; ⁄⁄ есть вершины нечётной степени
w:=0;
poisk(1);
for i:=1 to w do
write(way[i],′ ′);
close(input);
close(output);
end.
|
||||
Object © 2004 - 2005. All rights reserved. |
||||