Кирсанов М.Н. Графы в 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; |