<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## Kruskal算法 **最小生成樹**:在無向圖里找到一個連通圖的所有頂點的無環子集,使得子集中的邊的權重之和最小。 ### 算法描述 kruskal算法求圖的最小生成樹(加邊法) 1. 初始化map,key=頂點,value=包含自己頂點的集合 2. 建立小根堆,按圖里所有邊的權值排序 3. 依次取出堆里的最小邊,判斷邊的from和to頂點是否在同一個集合 4. 如果不在就記錄邊到結果集合里,并且將from和to頂點合并到同一個集合 ### 步驟圖解析 ![](https://img.kancloud.cn/6c/7e/6c7e8b5593237e959dea62d2570453b0_1536x636.png) ![](https://img.kancloud.cn/e4/72/e472047d3f54490b413fc2e4957e2fb0_1532x632.png) ![](https://img.kancloud.cn/98/df/98df781e2c45168902996f3c26f193da_1526x630.png) ![](https://img.kancloud.cn/1f/30/1f3037e6909d21b0d3447b6a635180f2_1528x630.png) ![](https://img.kancloud.cn/96/63/96630b09f8e8dcb80f2d24316ed444af_1530x630.png) ![](https://img.kancloud.cn/97/b1/97b1358ea06ed6ea503a5656ce714c8d_1530x630.png) ``` kruskal mst edge: edge: 3->5的weight=1 edge: 1->3的weight=2 edge: 1->2的weight=3 edge: 2->4的weight=5 ``` ### Java代碼實現 ~~~ /** * kruskal算法求圖的最小生成樹(加邊法) * 1. 初始化map,key=頂點,value=包含自己頂點的集合 * 2. 建立小根堆,按圖里所有邊的權值排序 * 3. 依次取出堆里的最小邊,判斷邊的from和to頂點是否在同一個集合 * 4. 如果不在就記錄邊到結果集合里,并且將from和to頂點合并到同一個集合 * @return 最小邊集合 */ public Set<Edge> kruskalMST(){ Set<Edge> result = new LinkedHashSet<>(); SimpleSet simpleSet = new SimpleSet(vertexs.values()); // 小根堆,使用邊的權值排序 PriorityQueue<Edge> edgePQ = new PriorityQueue<>(((o1, o2) -> o1.weight - o2.weight)); for(Edge edge : edges){ edgePQ.offer(edge); } while (!edgePQ.isEmpty()){ Edge edge = edgePQ.poll(); // 邊的from和to不在同一個集合里 if(!simpleSet.isSameSet(edge.from,edge.to)){ // 合并 simpleSet.union(edge.from,edge.to); result.add(edge); } } return result; } ~~~ ~~~ // 簡單集合,替代并查集,提供判斷2個頂點是否在同一個集合的方法和合并2個頂點到同一個集合的方法 class SimpleSet{ private Map<Vertex,Set<Vertex>> vertexSetMap; // 初始化map,key=頂點,value=包含自己頂點的set public SimpleSet(Collection<Vertex> vertexs){ vertexSetMap = new HashMap<>(); for(Vertex vertex : vertexs){ Set<Vertex> set = new HashSet<>(); set.add(vertex); vertexSetMap.put(vertex,set); } } /** * 判斷2個頂點在同一集合 * @param from 開始頂點 * @param to 結束頂點 * @return 在同一個集合里返回true,反之返回false */ public boolean isSameSet(Vertex from,Vertex to){ return vertexSetMap.get(from) == vertexSetMap.get(to); } /** * 合并2個頂點到同一個集合 * @param from 開始頂點 * @param to 結束頂點 */ public void union(Vertex from,Vertex to){ Set<Vertex> fromSet = vertexSetMap.get(from); fromSet.addAll(vertexSetMap.get(to)); vertexSetMap.put(from,fromSet); for(Vertex next : vertexSetMap.get(to)){ vertexSetMap.put(next,fromSet); } } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看