Алгоритм Прима
Перейти к навигации
Перейти к поиску
|
O(V2) int prim(vector<vector<Edge>> &graph) {
vector<bool> visited(graph.size());
vector<int> dist(graph.size(), 1e9);
dist[0] = 0;
int mstWeight = 0;
for (int i = 0; i < graph.size(); i++) {
int nearestV = -1;
for (int v = 0; v < graph.size(); v++)
if (!visited[v] && (nearestV == -1 || dist[v] < dist[nearestV]))
nearestV = v;
visited[nearestV] = true;
mstWeight += dist[nearestV];
for (auto &[from, to, weight] : graph[nearestV])
if (dist[to] > weight)
dist[to] = weight;
}
return mstWeight;
}
Полностью аналогично реализации Дейкстры за O(V2). Единственная разница — в качестве расстояния до вершины используется длина не всего пути, а последнего ребра. |
O(ElogV) int prim(vector<vector<Edge>> &graph) {
vector<bool> visited(graph.size());
vector<int> dist(graph.size(), 1e9);
set<pair<int, int>> unvisited;
dist[0] = 0;
unvisited.insert({ dist[0], 0 });
int mstWeight = 0;
while (!unvisited.empty()) {
int nearestV = unvisited.begin()->second;
unvisited.erase(unvisited.begin());
visited[nearestV] = true;
mstWeight += dist[nearestV];
for (auto &[from, to, weight] : graph[nearestV]) {
if (!visited[to] && dist[to] > weight) {
unvisited.erase({ dist[to], to });
dist[to] = weight;
unvisited.insert({ dist[to], to });
}
}
}
return mstWeight;
}
Почти аналогично реализации Дейкстры за O(ElogV). В качестве расстояния до вершины используется длина не всего пути, а последнего ребра. В отличие от Дейкстры, использование visited обязательно (контртест — 1 2 2, 2 3 1). |
Ссылки
- e-maxx.ru — Алгоритм Прима
- neerc.ifmo.ru/wiki — Алгоритм Прима
- brestprog.neocities.org — Минимальное остовное дерево. Алгоритм Прима. Алгоритм Крускала)
- informatics.mccme.ru — Курс «Алгоритмы на графах» — часть 8
- algs4.cs.princeton.edu/lectures — 4.3 Minimum Spanning Trees
- VisuAlgo — Minimum Spanning Tree
- CodeLibrary — Prim's algorithm in O(V^2)
- CodeLibrary — Prim's algorithm in O(ElogV)
- Algos — Minimum spanning tree using Prim algorithm