Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Prolog] Минимальное остовное дерево


Автор: Arun 12.2.2008, 15:43
Дан взвешенный граф. Необходимо вычислить связный подграф, включающий все вершины исходного графа, и суммарный вес которого минимален.
сама не разбираюсь в языке, а когда искала находила тока в других средах разработки =\

/*
* Алгоритм Краскала
*/

kruskal(Vertices, Edges, MinimalSpanningTree):-
  listify(Vertices, Components),
  insertion_sort(Edges, SortedEdges),
  kruskal_1(Components, SortedEdges, MinimalSpanningTree).

kruskal_1([_], _, []):-!.
kruskal_1(Components, [e(A,B,C)|Edges], [e(A,B,C)|MinimalSpanningTree]):-
  member_of_member(Components, A, Comp1, Components1),
  member_of_member(Components1, B, Comp2, Components2), !,
  ord_union(Comp1, Comp2, Comp),
  kruskal_1([Comp|Components2], Edges, MinimalSpanningTree).
kruskal_1(Components, [_|Edges], MinimalSpanningTree):-
  kruskal_1(Components, Edges, MinimalSpanningTree).

listify([], []).
listify([X|Xs], [[X]|Yss]):-
  listify(Xs, Yss).

member_of_member([Xs|Xss], X, Xs, Xss):-
  ord_member(X, Xs).
member_of_member([Xs|Xss], X, Ys, [Xs|Zss]):-
  member_of_member(Xss, X, Ys, Zss).


это похожая задача, но препод не принимает =\

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)