Программа 23. Кирсанов М.Н. Графы в Maple , М.: Физматлит 2007
Распаковка кода Гапта
| > | restart;with(LinearAlgebra):with(networks): |
| > | with(plottools): |
| > | kod:=<3,1,1,1,1,4,2,1,2,3,3,3>: # Код Гапта |
| > | n1:=nops(kod); |
| > | n1:=Dimension(kod); |
| > | # Длина вектора кода |
| > | n:=add(kod[i],i=1..n1)+1: # Число вершин дерева |
| > | new(G): # Создание нового графа |
| > | addvertex(seq(i,i=1..n),G): # Добавление n вершин |
| > | rb:=seq([1,1+i],i=1..kod[n1]): # Список ребер |
| > | vr:=[1],[seq(i+1,i=1..kod[n1])]:# Список вершин |
| > | j:=1: t:=1: s:=1: |
| > | for m from 0 while n1-s-j+1>0 do |
| > | j:=s+j-1: |
| > | for s to kod[n1-m] do |
| > | t1:=seq(kod[n1]+i+t,i=1..kod[n1-s-j+1]); |
| > | rb:=rb,seq([j+s,kod[n1]+i+t],i=1..kod[n1-s-j+1]);# Увеличение списка ребер |
| > | t:=t+kod[n1-s-j+1]; |
| > | od: |
| > | end do: |
| > | rb;# Ответ. Список ребер |
Список вершин для рисунка
| > | vr:=[1]: |
| > | c[1]:=1:# Одна вершина в ярусе 1 |
| > | t:=0: h:=1: |
| > | for z while n1-t>0 do |
| > | t:=t+c[z]: |
| > | c[z+1]:=add(kod[n1-t+i],i=1..c[z]);# Число вершин яруса |
| > | h:=h+c[z+1]; vr:=vr,[seq(j,j=h+1-c[z+1]..h)]; od: |
| > | vr; # Ответ. Список вершин |
| > | addedge([rb],G): # Добавление к графу ребер |
| > | rotate(draw(Linear(vr),G),-Pi/2);# Рисунок графа |