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

二十一、搜索與圖論——拓撲序列(有向圖)

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

一、基本思路

1、概念定義

  • 拓撲序列定義:

    • 若一個由圖中所有點構成的序列 A滿足:對于圖中的每條邊 (x,y),x在 A中都出現在 y之前,則稱 A是該圖的一個拓撲序列。
    • 人話:始終滿足每條邊的起點在終點前面,從前指向后。
  • 有向圖拓撲序列,數據結構與算法,圖論,java,算法,數據結構,散列表

  • 注意:如果在有向圖中構成一個環(huán),則必定無法構成拓撲結構,也可以證明有向無環(huán)圖一定存在拓撲序列,即有向無環(huán)圖=拓撲圖

  • 入度:對一個節(jié)點而言,有多少條邊指向自己。
  • 出度:對一個節(jié)點而言,有多少條邊指向外面。

有向圖拓撲序列,數據結構與算法,圖論,java,算法,數據結構,散列表

二、拓撲序列模板

    1. 因為拓撲序列都是從前指向后面的,因此當前入度為0的點都可以當做是起點。
    1. 入度為0,意味著沒有任何一個點在我面前,可以放在最前面的位置。
    1. 每次遍歷完之后,就可以讓 入度-1,表示前面指向他的確定了一個,直到為0 ,就可以加入序列,這就代表著后面再也沒有指向這個節(jié)點的了。
// 偽代碼
queue <--- 所有入度為0的點
while(queue 不空){
	t = 隊頭;
	枚舉t的所有出邊(t ---> j){
		j = e[i];
		刪掉t ---> j這條邊,即入度 d[j]--;
		if (d[j] == 0){			// 此時 j 的入度為了 0 ,則可以放在最前面去了
			queue <--- j;		// 入隊
		}
	}
}
拓撲排序 —— 模板題 AcWing 848. 有向圖的拓撲序列
時間復雜度 O(n+m)	n 表示點數,m 表示邊數
bool topsort()
{
    int hh = 0, tt = -1;

    // d[i] 存儲點i的入度
    for (int i = 1; i <= n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;

    while (hh <= tt)
    {
        int t = q[hh ++ ];

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }

    // 如果所有點都入隊了,說明存在拓撲序列;否則不存在拓撲序列。
    return tt == n - 1;
}

  • 若存在環(huán),則找不到一個入度為 0 的點,沒有突破口,無法入隊。一個無環(huán)圖,一定存在一個入度為0的點。

三、例題題解

有向圖拓撲序列,數據結構與算法,圖論,java,算法,數據結構,散列表文章來源地址http://www.zghlxwxcb.cn/news/detail-767398.html

// java題解實現
import java.util.*;

public class Main{
    static int N = 100010;
    static int[] e = new int[N];
    static int[] ne = new int[N];
    static int[] h = new int[N];
    static int idx = 0;
    static int hh = 0;
    static int tt = -1;
    static int[] q = new int[N];
    static int[] d = new int[N];                // 表示入度大小,為了后面進行入度逐漸減小做準備
    static int n,m;
    
    static void add(int a, int b){
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx++;
    }
    
    static boolean topsort(){
        
        for(int i = 1; i <= n; i++){        // 首先將入度為0的節(jié)點加入隊列中
            if(d[i] == 0){
                q[++tt] = i;
            }
        }
        
        while(hh <= tt){
            int temp = q[hh++];             // 此處僅僅是對所控制的隊列進行了首節(jié)點后移
            
            for(int i = h[temp]; i != -1; i = ne[i]){
                int j = e[i];               // 遍歷當前隊列節(jié)點能到達的節(jié)點
                d[j] --;                    // 有點指向,那必然不為0,遍歷過去之后,就可以排除這個點指向了

                if(d[j] == 0){              // 如果入度后面為0了,說明沒有點指向他了
                    q[++tt] = j;             // 入度為0了,后面的遍歷沒有指向他的了,所以可以加入隊列了
                }
            }
        }
        
        return tt == n - 1;                  // 判斷是不是隊列已經將n個節(jié)點存在q中了,因為q從0開始存儲的
    }

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        n = in.nextInt();
        m = in.nextInt();
        
        for(int i = 0; i < N; i++){
            h[i] = -1;
            d[i] = 0;
        }
        
        for(int i = 0; i < m; i++){
            int a = in.nextInt();
            int b = in.nextInt();
            add(a, b);
            d[b]++;                         // 有節(jié)點指向 b故此需要進行入度+1
        }
        
        if(topsort()){
            for(int i = 0; i < n; i++){
                System.out.print(q[i] + " ");       // 盡管其中的hh指針已經移到后面,但是隊列中始終存儲著序列
            }
        }else{
            System.out.println("-1");
        }
        
    }
}

到了這里,關于二十一、搜索與圖論——拓撲序列(有向圖)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

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

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

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

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

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

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

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

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

    2024年02月11日
    瀏覽(20)
  • 教學計劃編制問題(數據結構 有向圖 拓撲排序)

    教學計劃編制問題(數據結構 有向圖 拓撲排序)

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

    2024年02月09日
    瀏覽(16)
  • 【數據結構——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

    【數據結構——有向圖】有環(huán)無環(huán)判定、拓撲排序(DFS、BFS)

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

    2024年02月09日
    瀏覽(16)
  • 二十九、搜索與圖論——克魯斯卡爾算法(Kruskal 算法,稀疏圖)

    二十九、搜索與圖論——克魯斯卡爾算法(Kruskal 算法,稀疏圖)

    解決問題: 多個城市中鋪公路,使城市之間可以相互聯通,問如何才能讓鋪設公路的長度最短——鋪設的路徑即為最小生成樹。 思想: 從小到大枚舉每條邊,從小到大試圖將每條邊假如生成樹,只要這條邊對應的兩個點不在一個集合,則把這條邊加到集合中來。 主要面對的

    2024年02月05日
    瀏覽(18)
  • Matlab論文插圖繪制模板第90期—帶權重的有向圖/圖論圖/網絡圖

    Matlab論文插圖繪制模板第90期—帶權重的有向圖/圖論圖/網絡圖

    在之前的文章中,分享了Matlab 有向圖 的繪制模板: 進一步,如果我們想 標注有向圖的每條邊的權重,或者直接用線條的粗細來表示權重 ,該怎么操作呢? 先來看一下成品效果: 特別提示:本期內容『數據+代碼』已上傳資源群中,加群的朋友請自行下載。有需要的朋友可

    2024年02月16日
    瀏覽(29)
  • 第三章 圖論 No.9有向圖的強連通與半連通分量

    第三章 圖論 No.9有向圖的強連通與半連通分量

    連通分量是無向圖的概念,yxc說錯了,不要被誤導 強連通分量:在一個有向圖中,對于分量中的任意兩點u,v,一定能從u走到v,且能從v走到u。強連通分量是一些點的集合,若加入其他點,強連通分量中的任意兩點就不能互相遞達 半連通分量:在一個有向圖中,對于分量中

    2024年02月13日
    瀏覽(17)
  • 試基于圖的深度優(yōu)先搜索策略寫一算法,判別以鄰接表方式存儲的有向圖中是否存在由頂點a到頂點b的路徑

    試基于圖的深度優(yōu)先搜索策略寫一算法,判別以鄰接表方式存儲的有向圖中是否存在由頂點a到頂點b的路徑

    試基于圖的深度優(yōu)先搜索策略寫一算法,判別以鄰接表方式存儲的有向圖中是否存在由頂點a到頂點b的路徑,注意a!=b(必須嚴格按照樣例進行輸入輸出,先輸入圖的頂點數和弧數,并依次輸入弧的相關信息,最后輸入要判斷的兩個頂點的信息) 樣例如下: 輸入: 5 4 2 4 2 1

    2024年02月15日
    瀏覽(19)
  • 搜索與圖論 - 搜索與圖在算法中的應用【中】

    搜索與圖論 - 搜索與圖在算法中的應用【中】

    目錄 迪杰斯特拉算法Dijkstra ?Dijkstra求最短路 I Dijkstra求最短路 II 貝爾曼-福特算法?bellman-ford 有邊數限制的最短路 SPFA算法 spfa求最短路 ?spfa判斷負環(huán) Floyd Floyd求最短路 ? 該算法不能存在負權邊 思路: 初始化距離數組, dist[1] = 0, dist[i] = inf; for n次循環(huán) 每次循環(huán)確定一個min加

    2023年04月08日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包