Программа 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);# Рисунок графа |