有向圖的拓撲排序

文章目錄

  • 概念及模板
  • 例題 雜務

概念及模板

有向圖的拓撲排序是指將有向無環圖中的所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u, v)在圖中,則u在該序列中排在v的前面。

例如,假設有n個任務,這些任務需要按照一定的順序執行,同時有些任務必須在其它任務完成之后才能執行,此時可以使用拓撲排序來確定任務的執行順序,從而保證所有任務都能夠被按照正確的順序執行完成。
比如:生成一個可執行程序,需要經歷預處理,編譯,匯編,鏈接四步,后面的步驟必須在前面的步驟完成后才能執行。

一個有向無環圖,一定至少存在一個入度為 0 的點(抽屜原理)
當有向圖中,某個點的入度為 0 的時候,說明是沒有一個點指向這個點的,那這個點就能作為起點指向其他點了,遍歷結束后,這個點就可以刪掉了(將 t 放在當前的最前面了),并將它指向的所有點的入度都減 1

  1. 定義一個隊列,將所有入度為 0 的點入隊
  2. 循環,每次取隊頭 t,枚舉 t 的所有出邊 j,將 d[j]-- ,如果減完后 d[j] == 0,就將這個點入隊,重復前面的操作,那么只要這個圖無環,就能依次將它的所有點突破掉
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100010;
int n, m;
int e[N], ne[N], h[N], idx;
int ret[N], p; // 記錄拓撲序的數組
int d[N]; // 記錄每個點的入度度數
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
int to_polo()
{queue<int> q;for(int i = 1; i <= n; i++) if(!d[i]) // 將所有入度為 0 的點全部入隊列 {q.push(i);ret[p++] = i;}while(q.size()){int t = q.front();q.pop();for(int i = h[t]; i != -1; i = ne[i]) // 遍歷所有出邊 {int j = e[i];d[j]--;if(d[j] == 0) // 如果等于 0, 就加入隊列 {q.push(j);ret[p++] = j;}}}if(p != n) return -1;else return 1;
}
int main()
{cin >> n >> m;memset(h, -1, sizeof h);while(m--){int a, b;cin >> a >> b;add(a, b);d[b] ++;}int ans = to_polo();if(ans == -1) cout << -1;else {for(int i = 0; i < p; i++) cout << ret[i] << " ";}return 0;
}

例題 雜務

雜務

題目中出現的,某一任務必須在某些任務完成后才能完成,這就是拓撲排序的標志

此題只需要記錄每個人物最快完成的時間即可:將所有入度為 0 的點放入隊列,然后遍歷所有出邊,將遍歷到的點的入度都減1,當一個點的入度減到 0 的時候,就可以加入隊列。
加入隊列后,這個點的最快時間就可以被更新了,最終答案在所有任務完成的最快時間中取最大值即可!

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 10100;
const int M = 100100;
int n;
int e[M], ne[M], h[N], idx;
int ti[N]; // id -> time 每個點所需要的時間
int Com[N]; // 記錄每個點完成的最快時間 
int d[N]; // 記錄某個點的入度個數 
int ans; // 答案
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
void to_polo()
{queue<int> q;for (int i = 1; i <= n; i++){if (d[i] == 0){q.push(i);Com[i] = ti[i];ans = max(ans, Com[i]);}}while (q.size()){int t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];Com[j] = max(Com[t], Com[j]); // 必須考慮最差情況d[j]--;if (!d[j]){Com[j] += ti[j];ans = max(ans, Com[j]);q.push(j);}}}cout << ans;
}
int main()
{memset(h, -1, sizeof h);cin >> n;for (int i = 1; i <= n; i++){int id, tim, tmp;cin >> id >> tim;ti[id] = tim;while (cin >> tmp){if (tmp == 0) break;add(tmp, id);d[id]++;}}to_polo();return 0;
}

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

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

相關文章

HarmonyOS鴻蒙學習筆記(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的關系Component生命周期Entry生命周期 生命周期流程圖生命周期展示示例代碼參考資料 HarmonyOS的生命周期可以分為Compnent的生命周期和Entry的生命周期&#xff0c;也就是自定義組件的生命周期和頁面的生命周期。 entry和Compone…

【傳知代碼】雙深度學習模型實現結直腸癌檢測(論文復現)

前言&#xff1a;在醫學領域&#xff0c;科技的進步一直是改變人類生活的關鍵驅動力之一。隨著深度學習技術的不斷發展&#xff0c;其在醫學影像診斷領域的應用正日益受到關注。結直腸癌是一種常見但危害極大的惡性腫瘤&#xff0c;在早期發現和及時治療方面具有重要意義。然而…

快手發布大模型產品“可圖”,超20種創新AI圖像玩法限免上線

近日&#xff0c;快手自研大模型產品“可圖”&#xff08;Kolors&#xff09;正式對外開放&#xff0c;支持文生圖和圖生圖兩類功能&#xff0c;已上線20余種AI圖像玩法。目前&#xff0c;用戶可以通過“可圖大模型”官方網站和微信小程序&#xff0c;免費使用各項AI圖像功能。…

純分享#126個電商平臺集合(包含60個不同國家)值得一看

01 亞洲 中國 淘寶&#xff1a;擁有大量的賣家和商品種類&#xff0c;主要面向中國市場。天貓:淘寶旗下的B2C電商平臺&#xff0c;提供品質保證、正品保障的商品。京東:中國第二大B2C電商平臺&#xff0c;提供品質保證、正品保障的商品。蘇寧易購: 中國家電連鎖巨頭蘇寧旗下的…

反VC情緒:加密市場需要新的分布式代幣發行方式

GME事件 GME事件反應了社交媒體在金融決策中的影響力&#xff0c;散戶投資者群體通過集體行動&#xff0c;改變了很多人對股市的看法和參與方式。 GME事件中&#xff0c;meme扮演了核心角色。散戶投資者使用各種meme來溝通策略、激勵持股行為&#xff0c;創造了一種反對華爾街…

【車載開發系列】汽車開發常用工具說明

【車載開發系列】汽車開發常用工具說明 【車載開發系列】汽車開發常用工具說明 【車載開發系列】汽車開發常用工具說明一. CANbedded二. Davinci Configurator Pro三. Davinci Developer-AUTOSAR軟件組件設計工具四. MICROSAR五. MICROSAR OS六. CANdelaStudio七. Volcano VSB八…

Mysql基礎教程(11):DISTINCT

MySQL DISTINCT 用法和實例 當使用 SELECT 查詢數據時&#xff0c;我們可能會得到一些重復的行。比如學生表中有很多重復的年齡。如果想得到一個唯一的、沒有重復記錄的結果集&#xff0c;就需要用到 DISTINCT 關鍵字。 MySQL DISTINCT用法 在 SELECT 語句中使用 DISTINCT 關…

Spring Boot 項目中使用 JSP

文章目錄 Spring Boot 項目中使用 JSP項目結構引入依賴包編寫頁面和后臺運行方式一&#xff1a;Maven 命令運行方式二&#xff1a;在 IDEA 中運行方式三&#xff1a;打 war 包部署運行 Spring Boot 項目中使用 JSP 在 Spring Boot 項目中不是不可以使用 JSP 。想在 Spring Boo…

【React】封裝一個好用方便的消息框(Hooks Bootstrap 實踐)

引言 以 Bootstrap 為例&#xff0c;使用模態框編寫一個簡單的消息框&#xff1a; import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…

打開C語言常用的內存函數大門(二)—— memmove()函數 (內含memmove的講解和模擬實現)

文章目錄 1. 前言2. memmove()函數2.1 memmove()函數與memcpy()函數的差異2.2 memmove()函數的原型2.3 memmove()函數的使用案例 3. memmove()函數的模擬實現4. 總結 1. 前言 在之前&#xff0c;我向大家介紹了C語言中的一個常用的內存函數memcpy函數。如果你還沒看的話&#…

碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組

代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組 文章目錄 代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組300.最長遞增子序列一、一維DP…

12k Star!Continue:Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋!

原文鏈接&#xff1a;&#xff08;更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號&#xff01;&#xff09; 12k Star&#xff01;Continue&#xff1a;Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋&#xff01; &…

Beamer中二階導、一階導數的顯示問題

Beamer中二階導、一階導數的顯示問題 在beamer中表示 f ′ f f′和 f ′ ′ f f′′時發現導數符號距離 f f f很近 \documentclass{beamer} \usepackage{amsmath,amssymb}\begin{document} \begin{frame}\frametitle{Derivative}Derivative:\[f^{\prime}(x) \quad f \quad…

C# 讀取txt大文件

1GB以下 using System.Text;namespace DotnetReadTxt;class Program {static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 Encoding.GetEncoding("GB2312");int index 0;using (StreamReader sr ne…

conda與pip的鏡像源與代理設置

conda與pip的鏡像源與代理設置 一、前言二、conda鏡像源設置2.1conda默認鏡像源介紹2.2通過終端設置鏡像源2.3通過配置文件設置鏡像源 三、pip鏡像源設置3.1pip默認鏡像源介紹3.2通過終端臨時設置鏡像源3.3通過配置文件設置一個或多個鏡像源 四、conda代理設置4.1通過終端設置代…

數據結構與算法筆記:基礎篇 - 棧:如何實現瀏覽器的前進和后退功能?

概述 瀏覽器的前進、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 當依次訪問完一串頁面 a-b-c 之后&#xff0c;點擊瀏覽器的后退按鈕&#xff0c;就可以查看之前瀏覽過的頁面 b 和 a。當后退到頁面 a&#xff0c;點擊前進按鈕&#xff0c;就可以重新查看頁面 b 和 c。但…

放開了去的 ulimit

放開了去的 ulimit 放開了去的 ulimitulimit簡介臨時修改打開文件數目永久修改系統總打開句柄限制更多信息 放開了去的 ulimit ulimit簡介 對于高并發或者頻繁讀寫文件的應用程序而言&#xff0c;有時可能需要修改系統能夠打開的最多文件句柄數&#xff0c;否則就可能會出現t…

HTTPS 原理技術

HTTPS原理技術 背景簡介原理總結 背景 隨著年齡的增長&#xff0c;很多曾經爛熟于心的技術原理已被歲月摩擦得愈發模糊起來&#xff0c;技術出身的人總是很難放下一些執念&#xff0c;遂將這些知識整理成文&#xff0c;以紀念曾經努力學習奮斗的日子。本文內容并非完全原創&am…

Element-ui使用上傳時彈框選擇文件類型

實現效果 1&#xff0c;點擊上傳&#xff0c;上傳文件&#xff1b; 2&#xff0c;選擇文件&#xff1b; 3&#xff0c;彈框選擇文件類型&#xff1b; 4&#xff0c;選擇類型后確定上傳&#xff1b; 一&#xff0c;上傳 跳過&#xff1b; 二&#xff0c;定義彈框下拉框…

Coolmuster Android Assistant: 手機數據管理的全能助手

在數字化時代&#xff0c;智能手機不僅是通訊工具&#xff0c;更是個人數據的中心。隨著數據量的不斷增加&#xff0c;如何有效管理和保護這些數據成為了一個重要議題。Coolmuster Android Assistant應運而生&#xff0c;它是一款專為安卓用戶設計的綜合數據管理軟件&#xff0…