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