BOJ 1197:最小生成ツリー
✔問題リンク
BOJ 1197:最小生成ツリー
✔トラブルシューティングポリシー
✔解決過程
✔正解コード
#include <bits/stdc++.h>
using namespace std;
using ti3 = tuple<int, int, int>;
// weight, vertex
vector<pair<int,int> > adj[10001];
bool vis[10001];
void prim(int v, int e);
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int v, e;
cin >> v >> e;
for(int i=0;i<e;i++) {
int a, b, c; // v1, v2, weight
cin >> a >> b >> c;
adj[a].push_back({c,b});
adj[b].push_back({c,a});
}
prim(v, e);
}
void prim(int v, int e) {
int cnt = 0;
int total = 0;
priority_queue<ti3, vector<ti3>, greater<ti3> > pq;
// start from v1
for(auto cur : adj[1])
pq.push({cur.first, 1, cur.second});
vis[1] = 1;
while(1) {
int weight, v1, v2;
tie(weight, v1,v2) = pq.top();
pq.pop();
// case 1: already in MST -> do nothing
if(vis[v2]) continue;
// case 2: include v2
vis[v2]=1;
total += weight;
cnt++;
if(cnt==v-1) break;
for(auto cur : adj[v2]) {
if(!vis[cur.second])
pq.push({cur.first, v2, cur.second});
}
}
cout << total;
}
✔正解コード
追加
✔ Comment
Priority QueueをMin Heapとして使用するには
priority_queue<int, vector<int>, greater<int>> pq;
形式で使うので、2番目のパラメータのベクトルは何なのか、3番目のパラメータは比較関数のように見えますが、いったい何をしているのかの関数を探して、また分からないものが現れて、探し始めて、果てがありません.C++は本当に正しく使うのは難しいです.また、Kruskalアルゴリズムが実装されているので、disjoint setのunion-findを知る必要があるので、また検索すると時間がゆっくりと溶けてしまいます.
✔参考資料
https://blog.encrypted.gg/915?category=773649
Reference
この問題について(BOJ 1197:最小生成ツリー), 我々は、より多くの情報をここで見つけました https://velog.io/@whyjyj0312/BOJ-1197-최소-스패닝-트리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol