[プログラマー/greedy/level 3]島への接続


コアタイプ


  • ギリシャ問題

  • クルーズアルゴリズム
  • 誤答を整理する


  • 問題を解決できなかったので、人の怒りを晴らすを真似してみました.

  • 最初はDFSで解決しようとしたが,DFS内部ナビゲーションロジックをどのように記述するか分からなかった.

  • クルースカアルゴリズムは初めて聞いたのですが、疎遠でしたが、新しい内容を知り、いい感じでした.

  • 考えた結果、今度の問題は熟考に欠けているようだ.問題を解くにはもっと深くしなければならない.△来週は二度と見ないから、解いてみよう.
  • 学習の場を整理する


    1.クルーズカルアルゴリズム(kruskalアルゴリズム)


  • クルーズアルゴリズムとは?

  • これは、すべてのノードを最小限のコストで接続するアルゴリズムです.
  • 최소 비용 신장 트리를 만들기 위한 알고리즘です.

  • 最小費用伸長木の解法は?

  • 幹線情報の重み付け値は오름차순으로 정렬である.

  • 料金は小さい幹線からグラフに含まれています.
  • 2.最小原価生成ツリー


  • 最低コスト延長ツリーとは?
  • 身長木のうち、使用する幹線の重み付けと최소の木

  • MSTの特徴は?

  • 幹線の加重和は最小にします.

  • n個の頂点の図はn-1 이하의 간선을 사용である.
  • 사이클이 포함되어서는 안된다 .
  • 3.union-findアルゴリズム

  • 합집합 찾기 알고리즘.△これも集合アルゴリズムです.

  • 複数のノードが存在する場合、2つのノードが選択され、現在、2つのノードは서로 같은 그래프에 속하는지를 판별하는 알고리즘である.
  • 問題の重要な戦略


    (クルーズアルゴリズムの概念に基づく解法と同じである.)

  • 権限値を昇順に並べ替えます.
  • union findの親配列を生成し、独自のインデックスで初期化します.

  • 親ノードが自分と同じノードを見つけるまで再帰を呼び出します.
  • 解題コード

    import java.util.Arrays;
    import java.util.Comparator;
    
    class Solution {
        public int solution(int n, int[][] costs) {
            Arrays.sort(costs, Comparator.comparingInt(a -> a[2]));
    
            int[] parents = new int[n];
            for (int i = 0; i < n; i++) {
                parents[i] = i;
            }
    
            int total = 0;
            for (int[] edge : costs) {
                int from = edge[0];
                int to = edge[1];
                int weight = edge[2];
    
                int fromParent = findParent(parents, from);
                int toParent = findParent(parents, to);
    
                if (fromParent == toParent) {
                    continue;
                }
    
                total += weight;
                parents[from] = fromParent;
            }
    
            return total;
        }
    
        private int findParent(int[] parents, int node) {
            if (parents[node] == node) {
                return node;
            }
            return parents[node] = findParent(parents, parents[node]);
        }
    }
    

    Reference


  • 接続プログラマー-島

  • [ロドンビン様]クルーズアルゴリズム

  • [羅東彬様]union-findアルゴリズム:和集アルゴリズムを求める

  • [アルゴリズム]最小拡張ツリー(MST)