BOJ 1197:最小生成ツリー


✔問題リンク


BOJ 1197:最小生成ツリー

✔トラブルシューティングポリシー

  • Minimun Spanning Tree
  • ✔解決過程

  • PrimまたはCrusecarアルゴリズムを使用してMSTを解くとよい.
  • ✔正解コード

    #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