国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

17.4:圖的拓撲排序

這篇具有很好參考價值的文章主要介紹了17.4:圖的拓撲排序。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

拓撲序一定是有向無環(huán)圖。

拓撲排序不唯一

17.4:圖的拓撲排序
17.4:圖的拓撲排序

拓撲排序方法一:

利用入度為零進行排序

思路:誰的入度為0,誰就是開始節(jié)點,將開始節(jié)點打印完之后,將開始節(jié)點的直接鄰居的入度減1,然后重復(fù)。

17.4:圖的拓撲排序

package algorithmbasic.class17;

import java.util.*;

//圖的拓撲排序
public class TopologySort {
    public static List<Node> sortedTopology(Graph graph) {
        //result用來盛放排序結(jié)果。
        List<Node> result = new ArrayList<>();
        //inmap存放節(jié)點與入度的對應(yīng)值。
        //key ——> 某個節(jié)點, value ——> 剩余入度
        HashMap<Node, Integer> inmap = new HashMap<>();
        //只有節(jié)點的入度為0才可以進入此隊列。
        Queue<Node> inZeroQueue = new LinkedList<>();

        for (Node node : graph.nodes.values()) {
            inmap.put(node, node.in);
            if (node.in == 0) {
                inZeroQueue.add(node);
            }
        }

        Node cur = inZeroQueue.poll();
        result.add(cur);
        for (Node next : cur.nexts) {
            //剩余入度減1.
            inmap.put(next, inmap.get(next) - 1);
            if (inmap.get(next) == 0) {
                inZeroQueue.add(next);
            }
        }
        return result;
    }
}

拓撲排序方法二:

利用點次進行排序。

17.4:圖的拓撲排序

點次越大的,排序位置越靠前。

而且我發(fā)現(xiàn)可以使用遞歸進行求點次。我們要求0的點次,那就需要求他的直接鄰居1,2,3的點次,然后對鄰居的點次求和再加1,就是0的點次。我們可以將每個點的點次放在一個表里面,這個表記錄著哪個節(jié)點的點次對應(yīng)著多少。這樣我們再求其他節(jié)點點次時直接從表里拿就行,減少重復(fù)性工作。

思路:
1:創(chuàng)建一個表 HashMap<DirectedGraphNode, Record> order = new HashMap<>() 用來記錄每個節(jié)點對應(yīng)的點次是多少。

2:遍歷整個圖中的每一個節(jié)點,記錄其點次。

3:創(chuàng)建一個有序表ArrayList records = new ArrayList<>() 用來記錄點次。

4:根據(jù)點次進行由大到小的排序。records.sort(new MyComparator());

5:然后再創(chuàng)建一個有序表ArrayList dnodes = new ArrayList<>() 根據(jù)點次的順序記錄節(jié)點。

注意為什么要創(chuàng)建Record這個內(nèi)部類。因為在 “ 根據(jù)點次的順序記錄節(jié)點” 時,我們需要根據(jù)點次找到對應(yīng)的節(jié)點,使用map是不可以的,因為點次大小有重復(fù)的。所以我們采用內(nèi)部類的方法,這樣每個點次都會有一一對應(yīng)的節(jié)點。

package algorithmbasic.class17;
//圖的拓撲排序方法二

import java.util.*;

// OJ鏈接:https://www.lintcode.com/problem/topological-sorting
public class TopologicalOrderDFS2 {
    /**
     * 節(jié)點內(nèi)部類
     */
    // 不要提交這個類
    public static class DirectedGraphNode {
        public int label;
        public ArrayList<DirectedGraphNode> neighbors;

        public DirectedGraphNode(int x) {
            label = x;
            neighbors = new ArrayList<DirectedGraphNode>();
        }
    }
    
    /**
     * 點次內(nèi)部類。
     */

    //記錄某個節(jié)點的點次。
    public static class Record {
        public DirectedGraphNode node;
        //點次。
        public long nodes;

        public Record(DirectedGraphNode node, long nodes) {
            this.node = node;
            this.nodes = nodes;
        }
    }

    /**
     * topSort方法
     * 傳入一張圖的所有節(jié)點,返回排序好后的所有節(jié)點。
     */

    public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
        //采用計算每個節(jié)點點次的方法。
        //建立一張表用來記錄每個節(jié)點對應(yīng)的點次是多少。
        HashMap<DirectedGraphNode, Record> order = new HashMap<>();
        ArrayList<Record> records = new ArrayList<>();
        ArrayList<DirectedGraphNode> dnodes = new ArrayList<>();

        //遍歷圖中每個節(jié)點,并記錄每個節(jié)點出現(xiàn)的點次。
        for (DirectedGraphNode cur : graph) {
            Record record = process(cur, order);
            records.add(record);
            //order.put(cur, record);
        }
        //Arrays.sort(records,new MyComparator());
        records.sort(new MyComparator());
        for (Record r : records) {
            dnodes.add(r.node);//這就是為什么要建立Record這個內(nèi)部類的原因。
        }
        return dnodes;
    }
    
    /**
     * 求點次的方法。
     */

    //傳入一個節(jié)點返回這個節(jié)點的點次。在遞歸的過程當中每個節(jié)點的點次其實都已經(jīng)記錄好了。
    public static Record process(DirectedGraphNode node, HashMap<DirectedGraphNode, Record> order) {
        if (order.containsKey(node)) {
            return order.get(node);
        }
        //order中沒有該點。
        long count = 0;
        for (DirectedGraphNode n : node.neighbors) {
            Record r = process(n, order);
            count += r.nodes;
        }
        Record record = new Record(node, count + 1);
        //先把當前節(jié)點及其點次放入map中然后再返回。這樣我們再求其他節(jié)點點次時直接從表里拿就行,減少重復(fù)性工作。
        order.put(node, record);
        return record;
    }

    /**
     * 比較器
     */
    
    public static class MyComparator implements Comparator<Record> {
        @Override
        public int compare(Record o1, Record o2) {
            //不要將long類型數(shù)據(jù)強制轉(zhuǎn)換成int類型,會出現(xiàn)溢出和截斷的風險,導(dǎo)致數(shù)據(jù)出現(xiàn)錯誤。
            //例如2147483648L -> int:-2147483648
            //它超過了int類型的最大值 2147483647。當將其強制轉(zhuǎn)換為int類型時,結(jié)果被截斷為int類型的最小值 -2147483648。
            //return (int)(o2.nodes - o1.nodes);
            return o1.nodes == o2.nodes ? 0 : (o1.nodes > o2.nodes ? -1 : 1);
        }
    }
}

拓撲排序方法三:

根據(jù)深度進行排序

17.4:圖的拓撲排序

package algorithmbasic.class17;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;

public class TopologicalOrderDFS1 {

    /**
     * 節(jié)點內(nèi)部類
     */

    public static class DirectedGraphNode {
        public int label;
        public ArrayList<DirectedGraphNode> neighbors;

        public DirectedGraphNode(int x) {
            label = x;
            neighbors = new ArrayList<DirectedGraphNode>();
        }
    }

    /**
     * 深度內(nèi)部類。
     */

    public static class Deep {
        public long deep;
        public DirectedGraphNode node;

        public Deep(long deep, DirectedGraphNode node) {
            this.deep = deep;
            this.node = node;
        }
    }

    /**
     * topSort方法
     */

    public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
        HashMap<DirectedGraphNode, Deep> order = new HashMap<>();
        ArrayList<Deep> deeps = new ArrayList<>();
        ArrayList<DirectedGraphNode> dNodes = new ArrayList<>();

        for (DirectedGraphNode node : graph) {
            Deep d = process(node, order);
            deeps.add(d);
        }
        deeps.sort(new MyComparator());
        for (Deep d : deeps) {
            dNodes.add(d.node);
        }
        return dNodes;
    }


    public static Deep process(DirectedGraphNode node, HashMap<DirectedGraphNode, Deep> order) {
        if (order.containsKey(node)) {
            return order.get(node);
        }
        long max = Long.MIN_VALUE;
        for (DirectedGraphNode n : node.neighbors) {
            Deep d = process(n, order);
            max = Math.max(max, d.deep);
        }
        Deep deep = new Deep(max + 1, node);
        order.put(node, deep);
        return deep;
    }

    public static class MyComparator implements Comparator<Deep> {
        @Override
        public int compare(Deep o1, Deep o2) {
            return o1.deep == o2.deep ? 0 : (o1.deep > o2.deep ? -1 : 1);
        }
    }
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-469899.html

到了這里,關(guān)于17.4:圖的拓撲排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

    【數(shù)據(jù)結(jié)構(gòu)——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

    有向圖(Directed Graph),也被稱為有向圖形或方向圖,是一種圖的類型。在有向圖中,圖中的邊具有方向,從一個頂點指向另一個頂點。 在有向圖中,每個頂點表示一個實體,而有向邊則表示實體之間的關(guān)系或連接。這種有方向性的邊表明了連接的起點和終點之間的單向關(guān)系

    2024年02月09日
    瀏覽(16)
  • 有向無環(huán)圖的應(yīng)用—描述表達式、AOV網(wǎng)、AOE網(wǎng)

    有向無環(huán)圖的應(yīng)用—描述表達式、AOV網(wǎng)、AOE網(wǎng)

    目錄 一、有向無環(huán)圖描述表達式 二、拓撲排序 相關(guān)概念? 實現(xiàn)方法? 算法代碼? 補充 三、關(guān)鍵路徑 相關(guān)概念? 算法步驟? 補充? 四、總結(jié)圖的應(yīng)用我們都學(xué)了什么 有向無環(huán)圖 :若一個有向圖中不存在環(huán),則稱為有向無環(huán)圖,簡稱DAG圖。? 對于一個表達式 ( (a+b)* ( b*(c+d)

    2024年02月12日
    瀏覽(20)
  • 有向圖的拓撲排序

    拓撲排序 。任意給定一個有向圖,設(shè)計一個算法,對它進行拓撲排序。拓撲排序算法思想:a.在有向圖中任選一個沒有前趨的頂點輸出;b.從圖中刪除該頂點和所有以它為尾的??;c.重復(fù)上述a、b,直到全部頂點都已輸出,此時,頂點輸出序列即為一個拓樸有序序列;或者直到

    2024年02月09日
    瀏覽(20)
  • 2023-8-29 有向圖的拓撲排序

    2023-8-29 有向圖的拓撲排序

    題目鏈接:有向圖的拓撲排序

    2024年02月11日
    瀏覽(20)
  • 教學(xué)計劃編制問題(數(shù)據(jù)結(jié)構(gòu) 有向圖 拓撲排序)

    教學(xué)計劃編制問題(數(shù)據(jù)結(jié)構(gòu) 有向圖 拓撲排序)

    ?本文對以下教學(xué)計劃編制問題的解決作出實現(xiàn),主要使用c語言(帶一點cpp),開發(fā)環(huán)境為codeblocks 17.12,希望對各位讀者有所幫助。(源碼和數(shù)據(jù)文件可在主頁獲取,同時還有使用視頻文件壓縮包,數(shù)據(jù)文件需要和exe在同一目錄下,結(jié)合某讀者的意見同時放到github了?) 地址如下

    2024年02月09日
    瀏覽(16)
  • 圖的拓撲排序

    圖的拓撲排序

    ????????拓撲排序是一個 有向無環(huán)圖(有向圖、弧不形成閉環(huán)) 的所有頂點的線性序列。該線性序列中,圖的每個頂點只出現(xiàn)一次,若頂點A到頂點B之間存在有向弧v1,v2,則頂點A一定在頂點B前面。 ? ? ????????圖的拓撲排序?qū)崿F(xiàn)很簡單,基本操作思想: ? ? ? ? 1、開

    2024年02月13日
    瀏覽(17)
  • 圖的拓撲排序(AOV網(wǎng)絡(luò))

    圖的拓撲排序(AOV網(wǎng)絡(luò))

    概念 拓撲排序是對有向無環(huán)圖的頂點的一種排序. AOV網(wǎng)絡(luò) : 在有向圖中, 用頂點表示活動或者任務(wù), 弧表示活動或者任務(wù)間的優(yōu)先關(guān)系, 則此有向圖稱為用頂點表示活動的網(wǎng)絡(luò)(Activity On Vertex簡稱AOV網(wǎng)絡(luò)). 拓撲序列(Topolagical Order) : 在有向無環(huán)圖中, 若存在頂點v i 到頂點v j 的路徑

    2024年01月22日
    瀏覽(14)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】圖的遍歷與拓撲排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】圖的遍歷與拓撲排序

    再上一篇中我們講了樹的兩種存儲方式:【數(shù)據(jù)結(jié)構(gòu)與算法】圖——鄰接表與鄰接矩陣 這一篇我們可以用數(shù)組來模擬鄰接表。 假設(shè)現(xiàn)在我們要進行n次操作,實現(xiàn)無向圖。 首先需要一個 保存是哪個節(jié)點 的數(shù)組 e 然后就是類似指針數(shù)組的 表 h ,每個表都會連一串單鏈表 e,ne

    2024年02月04日
    瀏覽(20)
  • 搜索與圖論(一)(深搜,廣搜,樹與圖的存儲遍歷,拓撲排序)

    搜索與圖論(一)(深搜,廣搜,樹與圖的存儲遍歷,拓撲排序)

    往深里搜,搜到葉子結(jié)點那里,回溯,到可以繼續(xù)到葉子結(jié)點深搜的位置。 1、回溯一定要恢復(fù)現(xiàn)場 2、定義一個與當前遞歸層數(shù)有關(guān)的終止條件(題目要求的東西) 3、每層都用循環(huán)判斷是否存在可以dfs的路 輸出數(shù)字組合 全排列的思想解決n皇后問題,用三個bool數(shù)組描述限制

    2024年02月19日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】有向無環(huán)圖(AOE-網(wǎng))的關(guān)鍵路徑(C語言)

    【數(shù)據(jù)結(jié)構(gòu)】有向無環(huán)圖(AOE-網(wǎng))的關(guān)鍵路徑(C語言)

    把用頂點表示事件,用弧表示活動,弧的權(quán)值表示活動所需要的時間的有向無環(huán)圖稱為 邊表示活動的網(wǎng) ,簡稱 AOE-網(wǎng) 。 在AOE-網(wǎng)中存在唯一的、入度為0的頂點,稱為 源點 ;存在唯一的、出度為0的頂點,稱為 匯點 。從源點到匯點的最長路徑長度即為完成整個工程任務(wù)所需的

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包