Кирсанов М.Н. Графы в Maple M.: Физматлит 2007
> | #Программа 34 c. 144 |
Гамильтоновы циклы
> | restart: with(networks): new(G): |
> | V:=[a,b,c,d,g]: n:=nops(V): |
> | addvertex(V,G): |
> | addedge({{a,c},{a,d},{b,g},{b,c}, |
> | {c,d},{d,g},[a,g],[a,b]},G): |
> | draw(G); |
> | B:=Matrix(n):C:=Matrix(n):P:=Matrix(n): |
> | A:=adjacency(G);# Матрица смежности |
> | for i to n do |
> | for j to n do |
> | if A[i,j]=1 then B[i,j]:=V[j];fi; |
> | od; |
> | od; |
> | C:=A: |
> | for k to n-1 do |
> | for i to n do |
> | for j to n do |
> | P[i,j]:=expand(subs(V[i]=0,V[j]=0,add(B[i,m]&*C[m,j],m=1..n))); |
> | od; |
> | od; |
> | for i to n do for j to n do C[i,j]:=P[i,j];od;od; |
> | if k<>(n-1) then for i to n do C[i,i]:=0; od;fi; |
> | k,C; |
> | od: |
> | S:={}: |
> | for i to n do |
> | if C[i,i]<>0 then |
> | S:=S union {expand(C[i,i]&*V[i])};fi; |
> | od; |
> | F:={}: |
> | for q in S do |
> | if whattype(q)=`+` then F:=F union {op(q)} |
> | else F:=F union {q}: |
> | fi; |
> | od; |
> | S:=map(x -> convert(x,list),F): |
> | for q in S do #Убираем короткие контуры |
> | if nops(q)<>n then S:=S minus {q};fi; |
> | od; |
> | k:=nops(S):# Число помеченных контуров |
> | H:={}: |
Вершину 1 ставим на первое место в контуре
> | for j to k do |
> | for i to n do #m-место 1-й вершины в контуре |
> | if S[j][i]=V[1] then m:=i;fi; |
> | od; |
> | for i to n do |
> | Z[i]:=S[j][(i+m-2 mod n)+1]; |
> | od; |
> | H:=H union {convert(Z,list)}: |
> | od: |
> | H; |