MSTアルゴリズム
8275 ワード
MSTという名前の最小生成ツリー
≪ツリーの生成|Generate Tree|oem_src≫:すべてのノードが接続されたツリー
MST:すべてのノードを最低コストで接続するツリー
答えは唯一じゃない
MSTにはkruskalとprimがあります.
kruskal(幹線全体の小さな部分から接続)は実現しにくいためprimで実現する.
Prim's
1.最初にツリーを作成します.
2.出発点から、現段階で行けるすべての場所を検索し、最も安い場所に接続します.
優先キューが使用されます.
例:
実装のために、優先順位キューに値を入力できます.
優先キュー
≪ツリーの生成|Generate Tree|oem_src≫:すべてのノードが接続されたツリー
MST:すべてのノードを最低コストで接続するツリー
答えは唯一じゃない
MSTにはkruskalとprimがあります.
kruskal(幹線全体の小さな部分から接続)は実現しにくいためprimで実現する.
Prim's
1.最初にツリーを作成します.
2.出発点から、現段階で行けるすべての場所を検索し、最も安い場所に接続します.
優先キューが使用されます.
例:
実装のために、優先順位キューに値を入力できます.
優先キュー
//int형 priorityQueue 선언 (우선순위가 낮은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
//int형 priorityQueue 선언 (우선순위가 높은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
private static int prim() {
int ret = 0;
visited = new boolean[V + 1]; // 방문 관리
pq = new PriorityQueue<Node>(); // 우선 순위 큐
pq.add(new Node(1, 0));
int cnt = 0;
while (!pq.isEmpty()) {
Node edge = pq.poll();
// 이미 방문한 정점인 경우
if (visited[edge.to]) {
continue;
}
ret += edge.value;
visited[edge.to] = true;
// 모든 노드를 방문한 경우
if (++cnt == V) {
return ret;
}
// 연결된 노드들 중 방문하지 않은 노드 탐색
for (int i = 0; i < adj[edge.to].size(); i++) {
Node next = adj[edge.to].get(i);
if (visited[next.to]) {
continue;
}
pq.add(next);
}
}
return ret;
}
Reference
この問題について(MSTアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@cse05091/MST-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol