Персональные инструменты
 

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

Материал из 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:Алгоритм Прима