拓撲排序[講課留檔]

拓撲排序

拓撲排序要解決的問題是給一個有向無環圖的所有節點排序

即在 A O E AOE AOE網中找關鍵路徑

前置芝士!
  • 有向圖:有向圖中的每一個邊都是有向邊,即其中的每一個元素都是有序二元組。在一條有向邊 ( u , v ) (u,v) (u,v)中,稱 u u u v v v直接前驅 v v v u u u直接后繼
  • 有向無環圖 ( D i r e c t e d A c y c l i c G r a p h ) (Directed\ Acyclic\ Graph) (Directed?Acyclic?Graph):沒有有向環,但不保證原圖變成無向圖時無環。


  • D A G DAG DAG的性質:能拓撲的圖一定是 D A G DAG DAG D A G DAG DAG一定能拓撲。( A O E 和 A O V AOE和AOV AOEAOV網都是 D A G DAG DAG)
  • 度:頂點 v v v的度數是與 v v v關聯的邊數。有向圖中沒有度的概念。
  • 入度、出度:入度是指以該頂點為終點的有向邊數量;頂點的出度是指以頂點為起點的有向邊數量。無向圖中沒有出入度的概念。
舉個例子!

我們可以拿大學排課的例子來描述這個過程,比如學習大學課程中有:程序設計,算法語言,高等數學,離散數學,編譯技術,數據結構,數據庫系統等。當我們想要學習數據結構的時候,就必須先學會離散數學編譯技術算法語言

這些課程就相當于幾個頂點 u u u, 頂點之間的有向邊 ( u , v ) (u,v) (u,v)就相當于學習課程的順序。教務處安排這些課程,使得在邏輯關系符合的情況下排出課表,就是拓撲排序的過程。

但是如果某一天排課的老師打瞌睡了,說想要學習數據結構,還得先學操作系統,而操作系統的前置課程又是數據結構,那么到底應該先學哪一個(不考慮同時學習的情況)?在這里數據結構操作系統間就出現了一個環,顯然你現在沒辦法弄清楚你需要先學什么了,于是你也沒辦法進行拓撲排序了。

拓撲排序即,在一個 D A G DAG DAG(有向無環圖)中,我們將圖中的頂點以線性方式進行排序,使得對于任何的頂點u到v的有向邊 ( u , v ) (u,v) (u,v), 都可以有 u u u v v v的前面。

嚴謹來說,給定一個 D A G DAG DAG,如果從 i i i j j j有邊,則認為 j j j依賴于 i i i。如果 i i i j j j有路徑( i i i可達 j j j ),則稱 j j j間接依賴 i i i。拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴于排在后面的節點

理論存在!
  1. 從圖中選擇一個入度為零的點。
  2. 記錄該頂點,從圖中刪除此頂點及其所有的出邊。

重復上面兩步,直到所有頂點都輸出,拓撲排序完成,此時我們可以得到一個點的出隊順序(遍歷順序)這個序列叫拓撲序;或者圖中不存在入度為零的點,此時說明圖是有環圖,拓撲排序無法完成。

拓撲排序需要遍歷整張圖,假設該圖為 G ( V , E ) G(V,E) G(V,E),獲得拓撲序的時間復雜度大約是O(V+E)

實踐開始!
void topu_sort() {queue<int>q;for (int i = 1; i <= n; ++i) {if (!d[i])q.push(i);}while (!q.empty()) {int now = q.front();q.pop();ans.push_back(now);int len = vec[now].size();for (int i = 0; i < len; ++i) {int to = vec[now][i];d[to]--;if (!d[to]) q.push(to);}}/*for(auto x:vec[now]){d[x]--;if(!d[x]) q.push(x);}*/
}
例題

拓撲模板:B3644 【模板】拓撲排序 / 家譜樹 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)

AC代碼:

#include<bits/stdc++.h>
using namespace std;
const int N = 150;
int n;
vector<int> e[N];
int d[N];
vector<int> ans;void topu() {queue<int> q;for (int i = 1; i <= n; ++i) {if (d[i] == 0) q.push(i);}while (!q.empty()) {int now = q.front();q.pop();ans.push_back(now);for (auto x: e[now]) {d[x]--;if (d[x] == 0) q.push(x);}}
}int main() {cin >> n;for (int i = 1; i <= n; ++i) {int x;while (cin >> x) {if (x == 0) break;d[x]++;e[i].push_back(x);}}topu();for (auto x: ans) {cout << x << " ";}cout << '\n';return 0;
}
提高
拓撲構造:Problem - E - Codeforces
解析:

先忽略所有輸入的無向邊(但是不忽略點),對當前的有向圖拓撲排序,如果給定的有向圖中已經不是 D A G DAG DAG顯然是一定不成立也無法構造的;如果當前的圖是 D A G DAG DAG,那么拓撲完我們可以得到一個或多個拓撲序,每個拓撲序都是線性的,這也代表當選定一個拓撲序,在所有點中任選兩個點,他們一定有已知確定先后順序,我們按照這樣的順序去構造,建邊(每次令拓撲序靠前的指向靠后的)即可保證不會出現拓撲序靠前的點依賴于靠后的點,則不會出現有向環。

AC代碼:
pii ans[N];
vector<int>e[N];
int d[N];
int n,m,order=0;
int ord[N];bool topu(){queue<int>q;for(int i=1;i<=n;++i){if(!d[i]){q.push(i);}}while(!q.empty()){int t=q.front();q.pop();ord[t]=++order;for(auto x:e[t]){d[x]--;if(!d[x])q.push(x);}}if(order!=n)return 0;return 1;
}void work() {cin>>n>>m;int tot=0;order=0;for(int i=1;i<=n;++i){d[i]=0;e[i].clear();ans[i].fi=ans[i].se=0;}for(int i=1;i<=m;++i){int z,u,v;cin>>z>>u>>v;if(z){e[u].pb(v);d[v]++;}else{ans[++tot].fi=u;ans[tot].se=v;}}if(!topu()){cout<<"No\n";return;}cout<<"Yes\n";for(int i=1;i<=tot;++i){if(ord[ans[i].fi]>ord[ans[i].se])swap(ans[i].se,ans[i].fi);cout<<ans[i].fi<<" "<<ans[i].se<<'\n';}for(int i=1;i<=n;++i){if(e[i].size()){for(auto x:e[i]){cout<<i<<" "<<x<<'\n';}}}
}

課后練習:P1347 排序 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)

總結:

拓撲排序是圖論中非常基礎的算法,大多時候作為工具,或者一些進階算法的預處理內容,非常簡單,同時需要熟練掌握。

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

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

相關文章

JavaScript 動態網頁實例 —— 廣告效果

廣告是現代網頁設計中不可或缺的內容。廣告可以有很多種形式,但最終目的都是要吸引觀眾的注意力。盡管廣告少不了畫面、音效和廣告語等效果,但其實現主要還是應用JavaScript 代碼,只要很好掌握了JavaScript程序設計,剩下的就是創意和美工了。本章介紹幾種廣告效果,包括對聯…

ChatGPT 官方發布桌面端,向所有用戶免費開放

Open AI 官方已經發布了適用于 macOS 的 ChatGPT 桌面端應用。 此前&#xff0c;該應用一直處于測試階段&#xff0c;僅 Plus 付費訂閱用戶可以使用。 目前已面向所有用戶開放&#xff0c;所有 Mac 用戶均可免費下載使用。 我們可以訪問官網下載安裝包&#xff1a;https://op…

Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹 最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測&#xff0c;對文件進行分類&#xff0c;有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意&#xff0c;最后東拼西湊搞了個相對全面的檢測工具代碼類&#xff0c;希望能給需要的人帶來幫助。 說明 這段…

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…

基于JSP技術的校園餐廳管理系統

開頭語&#xff1a; 你好呀&#xff0c;我是計算機學長貓哥&#xff01;如果您對校園餐廳管理系統感興趣或有相關需求&#xff0c;歡迎隨時聯系我。我的聯系方式在文末&#xff0c;期待與您交流&#xff01; 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#x…

QT的編譯過程

qmake -project 用于從源代碼生成項目文件&#xff0c;qmake 用于從項目文件生成 Makefile&#xff0c;而 make 用于根據 Makefile 構建項目。 詳細解釋&#xff1a; qmake -project 這個命令用于從源代碼目錄生成一個初始的 Qt 項目文件&#xff08;.pro 文件&#xff09;。它…

Keil5中:出現:failed to execute ‘...\ARMCC\bin\ArmCC‘

點三個點&#xff0c;去自己的磁盤找自己的ARM\ARMCC\bin

深入解析:計算機系統總線全方位解讀

在計算機組成原理中&#xff0c;總線系統是連接計算機各個部件的重要通道。本文將詳細介紹系統總線的基本概念、分類、特性及性能指標、結構和控制方式。希望通過本文的講解&#xff0c;能夠幫助基礎小白更好地理解計算機系統總線的工作原理。 系統總線 (System Bus) 系統總線…

查看視頻時間基 time_base

時間基、codec, 分辨率&#xff0c;音頻和視頻的都一樣&#xff0c;才可以直接使用ffmpeg -f concat -i file.txt 方式合并。 On Thu, Dec 03, 2015 at 21:54:53 0200, redneb8888 wrote: I am looking for a way to find the time base of a stream (video or audio), $ ffpr…

selenium 簡介以及 selenium 環境配置

文章目錄 一、初識 selenium1.selenium 簡介2.selenium 三大組件3.selenium工作過程和原理4.selenium自動化測試流程5.selenium優點 二、自動化測試1.UI自動化本質2.UI自動化的前提3.適用場景4.UI自動化的原則5.UI自動化的覆蓋率 三、selenium 環境配置 一、初識 selenium 1.s…

單點登錄demo

gitee.com 搜索xxl(許雪里) 的sso 操作demo 完整流程圖

網絡安全控制相關技術

1.惡意代碼&#xff08;Malware&#xff09; 網絡從出現、發展演進都始終伴隨著安全方面的問題&#xff0c;只是每個階段表現的形式不同而已。在網絡安全方面&#xff0c;不能不提進行網絡攻擊的網絡病毒&#xff0c;或者說惡意代碼&#xff08;Malware&#xff09;。所有惡意…

MySQL中的網絡命名空間支持

Network Namespace Support&#xff08;網絡命名空間支持&#xff09; 提供了在Linux系統中創建和管理多個隔離網絡空間的能力。網絡命名空間是來自主機系統的網絡堆棧的邏輯副本。網絡命名空間對于設置容器或虛擬環境非常有用。每個名稱空間都有自己的IP地址、網絡接口、路由表…

什么是應用安全態勢管理 (ASPM):綜合指南

軟件開發在不斷發展&#xff0c;應用程序安全也必須隨之發展。 傳統的應用程序安全解決方案無法跟上當今開發人員的工作方式或攻擊者的工作方式。 我們需要一種新的應用程序安全方法&#xff0c;而ASPM在該方法中發揮著關鍵作用。 什么是 ASPM&#xff1f; 應用程序安全…

配電智能網關賦能電力系統智能化運行維護

隨著智能電網和物聯網技術的不斷發展&#xff0c;兩者之間的融合應用成為電力行業的重要趨勢。配電智能網關作為連接兩者的關鍵設備&#xff0c;在智能電網的物聯網應用中發揮著重要作用。 配電智能網關能夠實現對電力系統的實時監控、數據采集、遠程控制等功能&#xff0c;為…

已解決org.omg.CORBA.portable.RemarshalException:在CORBA中需要重新編組的正確解決方法,親測有效!!!

已解決org.omg.CORBA.portable.RemarshalException&#xff1a;在CORBA中需要重新編組的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 服務器端代碼 客戶端代碼 報錯原因 解決思路 解決方法 1. 檢查網絡連接 …

力扣:LCR 024. 反轉鏈表(Java)

目錄 題目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代碼實現&#xff1a; 題目描述&#xff1a; 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#x…

Xinstall智能安裝頁面:一鍵喚起App,提升用戶體驗

在移動互聯網時代&#xff0c;App已經成為我們日常生活中不可或缺的一部分。然而&#xff0c;隨著App數量的不斷增加&#xff0c;用戶面臨著越來越多的選擇&#xff0c;如何快速、便捷地安裝并打開App成為了用戶的一大痛點。針對這一問題&#xff0c;Xinstall憑借其強大的技術實…

數據結構——Hash Map

1. Hash Map簡介 Hash Map是一種基于鍵值對的數據結構&#xff0c;通過散列函數將鍵映射到存儲位置&#xff0c;實現快速的數據查找和存儲。它可以在常數時間內完成查找、插入和刪除操作&#xff0c;因此在需要頻繁進行這些操作時非常高效。 2. Hash Map的定義 散列表&#xff…