克魯斯科爾算法(Kruskala) -最小生成樹

  1. 通過(guò)將所有權(quán)重排序排作,依次從小到大备恤,依次取蚓耽,不能形成回路
public class KruskalaCase {

    public static final int FIN = Integer.MAX_VALUE;

    public static void main(String[] args) {
        char[] data = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
        int verxs = data.length;
        int[][] weight = {
                {0, 12, FIN, FIN, FIN, 16, 14},
                {12, 0, 10, FIN, FIN, 7, FIN},
                {FIN, 10, 0, 3, 5, 6, FIN},
                {FIN, FIN, 3, 0, 4, FIN, FIN},
                {FIN, FIN, 5, 4, 0, 2, 8},
                {16, 7, 6, FIN, 2, 0, 9},
                {14, FIN, FIN, FIN, 8, 9, 0}
        };
        KMinTree kmt = new KMinTree();
        KGraph graph = kmt.createGraph(verxs, data, weight);
        kmt.show(graph);
        List<ENode> eNodes = kmt.toEnodeList(graph);
        Collections.sort(eNodes);
        List<ENode> minTree = kmt.createMinTree(eNodes, graph);
        System.out.println(minTree);

    }
}

class KMinTree {

    public KGraph createGraph(int verxs, char[] data, int[][] weight) {
        KGraph graph = new KGraph(verxs, data, weight);
        return graph;
    }

    public void show(KGraph graph) {
        for (int i = 0; i < graph.weight.length; i++) {
            for (int j = 0; j < graph.weight[0].length; j++) {
                System.out.printf("%13d ", graph.weight[i][j]);
            }
            System.out.println();
            System.out.println();
        }
    }

    public List<ENode> toEnodeList(KGraph graph) {
        List<ENode> eNodes = new ArrayList<>();
        for (int i = 0; i < graph.weight.length; i++) {
            for (int j = i + 1; j < graph.weight[0].length; j++) {

                if (graph.weight[i][j] != KruskalaCase.FIN && graph.weight[i][j] != 0) {
                    ENode node = new ENode(graph.weight[i][j], graph.data[i], graph.data[j]);
                    eNodes.add(node);
                }
            }
        }
        return eNodes;
    }

    public int getPosition(char c, KGraph graph) {

        for (int i = 0; i < graph.data.length; i++) {
            if (graph.data[i] == c) {
                return i;
            }
        }
        return -1;
    }

    public int getEnd(int[] ends, int postion) {
        while (ends[postion] != 0) {
            postion = ends[postion];
        }
        return postion;
    }

    public List<ENode> createMinTree(List<ENode> nodes, KGraph graph) {
        List<ENode> visited = new ArrayList<>();
        Set<Character> vv = new HashSet<>();
        int[] ends = new int[nodes.size()];

        for (int i = 0; i < nodes.size(); i++) {

            int p1 = getPosition(nodes.get(i).start, graph);
            int p2 = getPosition(nodes.get(i).end, graph);

            int m = getEnd(ends, p1);
            int n = getEnd(ends, p2);
            if (m != n) {
                ends[m]  = n;
                visited.add(nodes.get(i));
            }
        }
        return visited;
    }
}

class ENode implements Comparable<ENode> {

    int weight;
    char start;
    char end;

    public ENode(int weight, char start, char end) {
        this.weight = weight;
        this.start = start;
        this.end = end;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("ENode{");
        sb.append("weight=").append(weight);
        sb.append(", start=").append(start);
        sb.append(", end=").append(end);
        sb.append('}');
        return sb.toString();
    }

    @Override
    public int compareTo(ENode o) {
        return this.weight - o.weight;
    }
}

class KGraph {
    int verxs;
    char[] data;
    int[][] weight;
    public KGraph(int verxs, char[] data, int[][] weight) {
        this.verxs = verxs;
        this.data = data;
        this.weight = weight;
    }
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栅葡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沧踏,更是在濱河造成了極大的恐慌歌逢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘狱,死亡現(xiàn)場(chǎng)離奇詭異秘案,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盒蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門踏烙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人历等,你說(shuō)我怎么就攤上這事讨惩。” “怎么了寒屯?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵荐捻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我寡夹,道長(zhǎng)处面,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任菩掏,我火速辦了婚禮魂角,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘智绸。我一直安慰自己野揪,他們只是感情好访忿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斯稳,像睡著了一般海铆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挣惰,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天卧斟,我揣著相機(jī)與錄音,去河邊找鬼憎茂。 笑死珍语,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唇辨。 我是一名探鬼主播廊酣,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼能耻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赏枚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晓猛,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饿幅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后戒职,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栗恩,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年洪燥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磕秤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捧韵,死狀恐怖市咆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情再来,我是刑警寧澤蒙兰,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芒篷,受9級(jí)特大地震影響搜变,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜针炉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一挠他、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篡帕,春花似錦殖侵、人聲如沸摔蓝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贮尉。三九已至,卻和暖如春朴沿,著一層夾襖步出監(jiān)牢的瞬間猜谚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工赌渣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魏铅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓坚芜,卻偏偏與公主長(zhǎng)得像览芳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸿竖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容