国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【圖論】最小生成樹

?xiaoxiao, / 1885人閱讀

摘要:最小生成樹有兩種生成算法普里姆算法克魯斯克爾算法算法普利姆算法算法流程我的理解任選一個元素,作為起始點將起始點標記為,代表該點已經加入最小生成樹集合計算這個集合到未加入的各個點的距離選擇一個最小的距離點,加入集合,即標記為已訪問更新集合到其

最小生成樹有兩種生成算法

Prim(普里姆算法)

Kruskal(克魯斯克爾)算法

Prim 算法(普利姆算法)

算法流程:(我的理解)

任選一個元素,作為起始點

將起始點標記為visit,代表該點已經加入最小生成樹集合

計算這個集合到未加入的各個點的距離

選擇一個最小的距離點,加入集合,即標記為已訪問

更新集合到其他各個點的最小距離

迭代

存疑

- 目前沒有找到記錄下路徑的辦法,不知道是不是還沒理解到位
Java 實現
package com.edu.chapter03;

import org.junit.Test;

public class MinimumTree {
    /**
     * 最小生成樹
     */
    int n;
    int e[][];
    int dis[];

    public void createMinmumTree() {
        int pos = 1; // 從1節點開始,可以任意指定;pos 代表當前要加入最小生成樹集合的編號
        int join[] = new int[n + 1]; // 記錄各個點加入的情況
        int weight = 0;
        // 初始化最小生成樹集合與其他各個點的距離
        for (int i = 1; i <= n; i++) {
            dis[i] = i == pos ? 0 : e[pos][i];
        }

        for (int i = 2; i <= n; i++) { // 從尋找第二個點開始(并不是代表要把2號點添加進去)
            int min = Integer.MAX_VALUE;
            for (int j = 1; j <= n; j++) {
                if (join[j] == 0 && dis[j] !=0 && min > dis[j]) { // 找出集合距離未加入的點的最近邊及點;dis[j]!=0 表示跳過和自己的比較
                    min = dis[j];
                    pos = j; // 找到最小位置,下一個要加入的點就是這個點
                }
            }

            join[pos] = 1; // 標記為以加入最小生成樹集合
            weight += min;
 
            //重新計算集合距離其他點的距離
            for (int j = 1; j <= n; j++) {
                if (join[j] == 0 && dis[j] > e[pos][j]) { // 比較新加入的點是否帶來的更短的距離,
                    dis[j] = e[pos][j]; //有,則更新。保證dis里存儲的是到其他點的最近距離
                }
            }
        }
        System.out.println("weight:" + weight);
    }

    @Test
    public void test01() {
        n = 6;
        e = new int[n + 1][n + 1];
        dis = new int[n + 1];

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i == j) {
                    e[i][j] = 0;
                } else {
                    e[i][j] = Integer.MAX_VALUE;
                }
            }
        }

        e[1][2] = e[2][1] = 2;
        e[1][3] = e[3][1] = 4;
        e[1][4] = e[4][1] = 7;

        e[2][3] = e[3][2] = 1;
        e[2][5] = e[5][2] = 2;

        e[3][4] = e[4][3] = 1;
        e[3][5] = e[5][3] = 6;
        createMinmumTree();
    }
}
Kruskal(克魯斯克爾)算法

算法思路

首先將圖中的邊按權重大小排序(從小到大)

可以使用快速排序或者堆排序

取出一條邊,將邊對應的兩個節點放入一個集合

如果集合中已經存在這兩個點,則放棄該邊

不斷有邊加入,將不同的集合連起來,直到集合包含了所有節點,結束

每次有效添加的一條邊,代表了最小生成樹中對應的邊,或者說路徑

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71310.html

相關文章

  • leetcode310. Minimum Height Trees

    摘要:現在要求在這樣一棵生成樹中,找到生成樹的高度最低的所有根節點。然后利用鄰接表的相關屬性來判斷當前節點是否是葉節點。度數為一的頂點就是葉節點。這里使用異或的原因是對同一個值進行兩次異或即可以回到最初值。 題目 For an undirected graph with tree characteristics, we can choose any node as the root. The...

    xiaoxiaozi 評論0 收藏0
  • Python貓薦書系列:文也深度學習,理也深度學習

    摘要:本期貓薦書欄目系列之六,就以此為話題,推薦給大家兩本書它們都叫深度學習,但是內容很不一樣。事實上,第一本書被很多人譽為深度學習的圣經,知名度極高,有一個昵稱叫作花書。 最近出了兩件大新聞,相信大家可能有所耳聞。 我來當個播報員,給大家轉述一下: 1、中國隊在第 11 界羅馬尼亞數學大師賽(RMM)中無緣金牌。該項賽事是三大國際賽事之一,被譽為中學奧數的最高難度。其中一道題,令中國隊全軍...

    LuDongWei 評論0 收藏0

發表評論

0條評論

?xiaoxiao,

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<