Кирсанов М.Н. Графы в Maple M.: Физматлит 2007
| > | #Программа 32 c.141 |
Остов наименьшего веса. Алгоритм минимального соседа
| > | restart: |
| > | with(networks): |
| > | with(plots): |
| > | new(G): n:=7: |
| > | new(Ost): addvertex(seq(i,i=1..n),Ost): |
| > | addvertex(seq(i,i=1..n),G): |
| > | addedge([{3,7},{1,2},{6,1},{5,6},{3,4},{2,7},{4,7},{1,7},{4,5},{6,7}], weights=[27,19,24,29,21,14,16,13,22,18],G): |
| > | draw(G); |
| > | for i to n do# Матрица весов |
| > | for j to n do |
| > | if(edges({i,j},G)<>{}) |
| > | then C[i,j]:=eweight(op(edges({i,j},G)),G); |
| > | else C[i,j]:=infinity; fi; |
| > | od; |
| > | end do; |
| > | V:=vertices(G): |
| > | w:=1: W:=V minus {w}: T:={}: |
| > | for v to n do near[v]:=w; d[v]:=C[v,w]; od: |
| > | for i while i<n+1 do # Основной цикл |
| > | addedge(T,Ost): |
| > | ris[i]:=draw(Linear([4],[5,3],[7],[6,2],[1]),Ost); |
| > | dmin:=infinity; |
| > | for j to n do |
| > | if d[j]<dmin and member(j,W) |
| > | then v:=j; dmin:=d[j]; |
| > | end if; |
| > | end do; |
| > | T:=T union {{near[v],v}}; |
| > | W:=W minus {v}; |
| > | for u to n do |
| > | if d[u]>C[u,v] and member(u,W) |
| > | then near[u]:=v; d[u]:=C[u,v]; |
| > | end if; |
| > | end do; |
| > | end do:# Конец основного цикла |
| > | MinWeight=add(eweight(op(edges(T[i],G)),G),i=1..n-1); |
| > | display(seq(ris[q],q=1..n),insequence=true,thickness=1,axes=none); |
| > |