Алгоритм Прима — различия между версиями

Материал из CustisWiki

Перейти к: навигация, поиск
м (реплицировано из внутренней CustisWiki)
м (Содержимое страницы заменено на «#REDIRECT [[discopal:{{PAGENAME}}]]»)
 
(не показано 5 промежуточных версий 3 участников)
Строка 1: Строка 1:
Алгоритм Прима предназначен для решения задачи
+
#REDIRECT [[discopal:{{PAGENAME}}]]
[[Минимальное остовное дерево]].
+
 
+
В этом алгоритме минимальный остов строится постепенно: сначала выбирается произвольная
+
вершина, которая включается в остов, затем, на каждой итерации, к
+
текущему остову добавляется наиболее дешевое ребро ''(u,v)'',
+
соединяющее какую-либо вершину из остова ''u'', с какой-либо
+
вершиной ''v'' не из остова.
+
Алгоритм Прима, похож на [[алгоритм Дейкстры]], он также является жадным алгоритмом.
+
 
+
Код алгоритма, представлен в виде функции на языке [[Python]].
+
 
+
Сложность алгоритма равна <math>O(n^3)</math>.
+
 
+
<code-python>
+
# Находит минимальное остовное дерево
+
# в графе $G$, со стартовой вершиной $s$
+
def mst_prim(G,s):
+
    print "StartVertice:",s
+
    # минимальное остовное дерево в виде хэш-таблицы (вершина:предшествующая вершина)
+
    MST={}                 
+
    ToVisit={s:0}    # хэш-таблица вершин, граничащих с MST, узел:(стоимость)
+
    Predecessor={s:s} # хэш, содержащий вершины из которых планируется включать другие вершины.
+
    while ToVisit:  # пока есть вершины, до которых не построен кратчайший путь
+
        print MST, ToVisit, "-------->",
+
        v=argmin(ToVisit)      # выбираем ближайшую достижимую вершину
+
        MST[v]=Predecessor[v]; del ToVisit[v]; del Predecessor[v]; 
+
        for w in G.neighbors(v): # для всех соседей вершины $v$
+
            if (w not in MST):  # которые еще не в нашем остовном дереве   
+
                # обновляем стоимость включения в MST
+
                if (w not in ToVisit) or (G.get_edge(v,w) < ToVisit[w]):
+
                    ToVisit[w] = G.get_edge(v,w)
+
                    Predecessor[w] = v
+
        print MST, ToVisit, Predecessor
+
    print MST
+
    return MST
+
</code-python>
+
 
+
StartVertice: 2
+
{} {2: 0} --------> {2: 2} {1: 15, 3: 20, 4: 15} {1: 2, 3: 2, 4: 2}
+
{2: 2} {1: 15, 3: 20, 4: 15} --------> {1: 2, 2: 2} {0: 60, 3: 20, 4: 10} {0: 1, 3: 2, 4: 1}
+
{1: 2, 2: 2} {0: 60, 3: 20, 4: 10} --------> {1: 2, 2: 2, 4: 1} {0: 60, 3: 20} {0: 1, 3: 2}
+
{1: 2, 2: 2, 4: 1} {0: 60, 3: 20} --------> {1: 2, 2: 2, 3: 2, 4: 1} {0: 50} {0: 3}
+
{1: 2, 2: 2, 3: 2, 4: 1} {0: 50} --------> {0: 3, 1: 2, 2: 2, 3: 2, 4: 1} {} {}
+
{0: 3, 1: 2, 2: 2, 3: 2, 4: 1}
+
 
+
<graph>
+
graph G{ rankdir=TB;
+
0 [label="NY(0)"];
+
1 [label="Moscow(1)"];
+
2 [label="Minsk(2)"];
+
3 [label="Berlin(3)"];
+
4 [label="Kiev(4)"];
+
0 -- 1[fontcolor="blue",label="$60",style=solid];
+
0 -- 3[fontcolor="blue",label="$50",style=bold];
+
0 -- 4[fontcolor="blue",label="$80",style=solid];
+
1 -- 2[fontcolor="blue",label="$15",style=bold];
+
1 -- 3[fontcolor="blue",label="$50",style=solid];
+
1 -- 4[fontcolor="blue",label="$10",style=bold];
+
2 -- 3[fontcolor="blue",label="$20",style=bold];
+
2 -- 4[fontcolor="blue",label="$15",style=solid];
+
3 -- 4[fontcolor="blue",label="$30",style=solid];
+
}
+
</graph>
+
 
+
 
+
[[Category:Алгоритмы]]
+
{{replicate-from-custiswiki-to-lib}}
+

Текущая версия на 20:45, 13 июня 2011

  1. REDIRECT discopal:Алгоритм Прима