數據結構--拓撲排序

數據結構–拓撲排序

AOV?

A O V ? \color{red}AOV? AOV?(Activity On Vertex NetWork,?頂點表示活動的?):
? D A G 圖 \color{red}DAG圖 DAG(有向?環圖)表示?個?程。頂點表示活動,有向邊 < V i , V j > <V_i, V_j> <Vi?,Vj?>表示活動Vi必須先于活動 V j V_j Vj?進?

注:如果圖中存在環路就不是 A O V 網 \color{red}注:如果圖中存在環路就不是AOV網 注:如果圖中存在環路就不是AOV

DAG圖是指有向無環圖(Directed Acyclic Graph),是一種有向圖的特殊形式。它由一些有向邊連接的節點組成,并且不存在任何形式的環。換句話說,從任何一個節點出發,沿著有向邊的方向無法經過一系列的節點再回到原始節點。DAG圖常用于表示一些具有依賴關系的任務或事件,其中每個節點表示一個任務或事件,有向邊表示任務或事件之間的依賴關系。DAG圖在計算機科學和工程中有廣泛的應用,例如任務調度、編譯器優化、數據流分析等領域。

拓撲排序

拓撲排序 \color{red}拓撲排序 拓撲排序:在圖論中,由?個 有向?環圖 \color{red}有向?環圖 有向?環圖的頂點組成的序列,當且僅當滿?下列條件時,稱為該圖的?個拓撲排序:
① 每個頂點出現且只出現?次。
② 若頂點A在序列中排在頂點B的前?,則在圖中不存在從頂點B到頂點A的路徑。或定義為:拓撲排序是對有向?環圖的頂點的?種排序,它使得若存在?條從頂點A到頂點B的路徑,則在排序中頂點B出現在頂點A的后?。每個AOV?都有?個或多個拓撲排序序列。

上圖其中一個拓撲排序:

拓撲排序的實現:

① 從AOV?中選擇?個沒有前驅的頂點并輸出。
② 從?中刪除該頂點和所有以它為起點的有向邊。
③ 重復①和②直到當前的AOV?為空或當前?中不存在?前驅的頂點為?。

注:拓撲排序序列可能有多個 \color{red}注:拓撲排序序列可能有多個 注:拓撲排序序列可能有多個

拓撲排序代碼實現

王道書上代碼

個人code

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int n, m;
int h[N], e[N], ne[N], idx;
int q[N], d[N];
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
bool topsort()
{int tt = -1, hh = 0;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];d[j]--;if(!d[j]) q[++tt] = j;}}return tt == n - 1;
}
int main()
{cin >> n >> m;memset(h, -1, sizeof(h));for(int i = 0; i < n; i++){int a, b;cin >> a >> b;add(a, b);d[b]++;}if(topsort()){for(int i = 0; i < n; i++)cout << q[i] << ' ';cout << endl;}else cout << "-1" << endl;return 0;
}

判斷是否存在拓撲序

時間復雜度 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;
}

逆拓撲排序

對?個AOV?,如果采?下列步驟進?排序,則稱之為 逆拓撲排序 \color{red}逆拓撲排序 逆拓撲排序
① 從AOV?中選擇?個沒有后繼( 出度為 0 \color{red}出度為0 出度為0)的頂點并輸出。
② 從?中刪除該頂點和所有以它為終點的有向邊。
③ 重復①和②直到當前的AOV?為空。

其中一個逆拓撲排序

逆拓撲排序代碼實現

逆拓撲排序的實現(DFS算法)

DFS判斷是否有環:

int vis[N], cnt; // timestamp
int per[N];
bool cyc[N];// 標記
void dfs(int u) //找環 & 標記環
{vis[u] = ++cnt;for (auto v : g[u]){if (per[u] == v)continue;if (!vis[v]){per[v] = u;dfs(v);}else if (vis[u] > vis[v]){for (int i = u; i != v; i = per[i])cyc[i] = true;cyc[v] = true;}}
}

如果單純判斷是否有環,只需要引進父結點(fa)
dfs(u,fa)
如果 u == fa 則存在環

知識點回顧與重要考點

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡的性能指標

計算機網絡的性能指標 1. 速率 速率是指數據在網絡中傳送的速度&#xff0c;通常用比特率或數據率來表示&#xff0c;單位是b/s&#xff0c;或bit/s&#xff0c;即比特每秒&#xff0c;或者bps(bit per second)。 速率單位&#xff1a;1 Ybps 10^24 bps(堯), 1 Zbps 10^21…

python中的lstm:介紹和基本使用方法

python中的lstm&#xff1a;介紹和基本使用方法 未使用插件 LSTM&#xff08;Long Short-Term Memory&#xff09;是一種循環神經網絡&#xff08;RNN&#xff09;的變體&#xff0c;專門用于處理序列數據。LSTM 可以記憶序列中的長期依賴關系&#xff0c;這使得它非常適合于各…

深度思考rpc框架面經之四

7 netty機制的一些理解 推薦閱讀&#xff1a; 深度思考netty網絡編程框架 7.1 Netty支持的端口號: Netty可以綁定到任何合法的端口號&#xff0c;這與大多數網絡庫類似。有效的端口范圍是從0到65535&#xff0c;但通常建議使用1024以上的端口&#xff0c;因為0-1023的端口已…

算法與數據結構(二十四)最優子結構原理和 dp 數組遍歷方向

注&#xff1a;此文只在個人總結 labuladong 動態規劃框架&#xff0c;僅限于學習交流&#xff0c;版權歸原作者所有&#xff1b; 本文是兩年前發的 動態規劃答疑篇open in new window 的修訂版&#xff0c;根據我的不斷學習總結以及讀者的評論反饋&#xff0c;我給擴展了更多…

【STM32】高效開發工具CubeMonitor快速上手

工欲善其事必先利其器。擁有一個輔助測試工具&#xff0c;能極大提高開發項目的效率。STM32CubeMonitor系列工具能夠實時讀取和呈現其變量&#xff0c;從而在運行時幫助微調和診斷STM32應用&#xff0c;類似于一個簡單的示波器。它是一款基于流程的圖形化編程工具&#xff0c;類…

面試題:線程池的底層工作原理

線程池的幾個重要的參數&#xff1a; 1、corePoolSize&#xff1a;線程池的核心線程數&#xff08;也是默認線程數&#xff09; 2、maximumPoolSize&#xff1a;最大線程數 3、keepAliveTime&#xff1a;允許的線程最大空閑時間&#xff08;單位/秒&#xff09; 線程池內部是…

鏈表之第二回

歡迎來到我的&#xff1a;世界 該文章收入欄目&#xff1a;鏈表 希望作者的文章對你有所幫助&#xff0c;有不足的地方還請指正&#xff0c;大家一起學習交流 ! 目錄 前言第一題&#xff1a;反轉一個鏈表第二題&#xff1a;鏈表內指定區間反轉第三題&#xff1a;判斷一個鏈表…

opencv+ffmpeg+QOpenGLWidget開發的音視頻播放器demo

前言 本篇文檔的demo包含了 1.使用OpenCV對圖像進行處理&#xff0c;對圖像進行置灰&#xff0c;旋轉&#xff0c;摳圖&#xff0c;高斯模糊&#xff0c;中值濾波&#xff0c;部分區域清除置黑&#xff0c;背景移除&#xff0c;邊緣檢測等操作&#xff1b;2.單純使用opencv播放…

一個案例:Vue2組件化開發組件從入門到入土

1. 環境搭建 1.1. 創建項目 npm install -g vue/clivue create vue_study_todolist1.2. 清空項目代碼 清楚HelloWorld.Vue代碼中的內容。 1.3. 啟動空項目 1.4 項目目標 項目組件實現以下效果 2. 組件拆分代碼 Vue是一個基于組件的框架&#xff0c;允許您將界面拆分成小的…

open cv學習 (五) 圖像的閾值處理

圖像的閾值處理 demo1 # 二值化處理黑白漸變圖 import cv2 img cv2.imread("./img.png", 0) # 二值化處理 t1, dst cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.des…

Golang使用MinIO

最近在使用Golang做了一個網盤項目&#xff08;學習&#xff09;&#xff0c;文件存儲一直保存在本地&#xff08;各廠商提供的oss貴&#xff09;&#xff0c;所以就在思考怎么來處理這些文件&#xff0c;類似的方案很對hdfs、fastdfs&#xff0c;但這其中MinIO是最近幾年比較火…

生信豆芽菜-差異基因富集分析的圈圖

網址&#xff1a;http://www.sxdyc.com/visualsEnrichCirplot 1、數據準備 準備一個基因集的文件 2、選擇富集分析的數據庫&#xff0c;同時輸入展示top幾的條目&#xff0c;選擇顏色&#xff0c;如果是GO的話選擇三個顏色&#xff0c;如果是KEGG選擇一個&#xff0c;如果是G…

神經網絡論文研讀-多模態方向-綜述研讀(上)

翻譯以機翻為主 原文目錄 前言 圖1&#xff1a;LMU印章&#xff08;左&#xff09;風格轉移到梵高的向日葵繪畫&#xff08;中&#xff09;并與提示混合 - 梵高&#xff0c;向日葵 -通過CLIPVGAN&#xff08;右&#xff09;。在過去的幾年中&#xff0c;自然語言處理&#xff…

微信小程序實現拖拽的小球

目錄 前言 js 獲取微信小程序中獲取系統信息 觸摸移動事件的處理函數 觸摸結束事件的處理函數 用于監聽頁面滾動事件 全局參數 html CSS 前言 小程序開發提供了豐富的API和事件處理函數&#xff0c;使得開發者可以方便地實現各種交互功能。其中&#xff0c;拖拽功能…

無涯教程-Perl - tell函數

描述 此函數返回指定FILEHANDLE中讀取指針的當前位置(以字節為單位)。如果省略FILEHANDLE,則它將返回上次訪問的文件中的位置。 語法 以下是此函數的簡單語法- tell FILEHANDLEtell返回值 此函數以字節為單位返回當前文件位置。 例 以下是顯示其基本用法的示例代碼,要檢…

leetcode473. 火柴拼正方形(回溯算法-java)

火柴拼正方形 leetcode473 火柴拼正方形題目描述回溯算法 上期經典算法 leetcode473 火柴拼正方形 難度 - 中等 原題鏈接 - leetcode473 火柴拼正方形 題目描述 你將得到一個整數數組 matchsticks &#xff0c;其中 matchsticks[i] 是第 i 個火柴棒的長度。你要用 所有的火柴棍…

BC119 小樂樂與字符串

描述 在慶祝祖國母親70華誕之際&#xff0c;老師給小樂樂出了一個問題。大家都知道China的英文縮寫是CHN&#xff0c;那么給你一個字符串s&#xff0c;你需要做的是統計s中子序列“CHN”的個數。子序列的定義&#xff1a;存在任意下標a < b < c&#xff0c;那么“s[a]s[b…

微服務—Eureka注冊中心

eureka相當于是一個公司的管理人事HR,各部門之間如果有合作時&#xff0c;由HR進行人員的分配以及調度&#xff0c;具體選哪個人&#xff0c;全憑HR的心情&#xff0c;如果你這個部門存在沒有意義&#xff0c;直接把你這個部門撤銷&#xff0c;全體人員裁掉&#xff0c;所以不想…

計算機網絡筆記

TCP有連接可靠服務 TCP特點&#xff1a; 1.TCP是面向連接的傳輸層協議&#xff1b; 2.每條TCP連接只能有兩個端點&#xff0c;每條TCP連接是一對一的&#xff1b; 3.TCP提供可靠交付&#xff0c;保證傳送數據無差錯&#xff0c;不丟失&#xff0c;不重復且有序&#xff1b; 4.…

Android Studio瀑布流實現

效果&#xff1a; ImageDetail class package com.example.waterfallflow; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView;public class ImageDetail extends Activity{Overrideprotected void …