Leetcode刷題 | Day63_圖論08_拓撲排序

?一、學習任務

  • 拓撲排序代碼隨想錄

二、具體題目

1.拓撲排序117. 軟件構建

【題目描述】

某個大型軟件項目的構建系統擁有 N 個文件,文件編號從 0 到 N - 1,在這些文件中,某些文件依賴于其他文件的內容,這意味著如果文件 A 依賴于文件 B,則必須在處理文件 A 之前處理文件 B (0 <= A, B <= N - 1)。請編寫一個算法,用于確定文件處理的順序。

【輸入描述】

第一行輸入兩個正整數 N, M。表示 N 個文件之間擁有 M 條依賴關系。

后續 M 行,每行兩個正整數 S 和 T,表示 T 文件依賴于 S 文件。

【輸出描述】

輸出共一行,如果能處理成功,則輸出文件順序,用空格隔開。

如果不能成功處理(相互依賴),則輸出 -1。

拓撲排序:BFS/DFS

本篇方法為BFS

拓撲排序的過程,只有兩步:

  1. 找到入度為0 的節點,加入結果集
  2. 將該節點從圖中移除

循環以上兩步,直到 所有節點都在圖中被移除了。

結果集的順序,就是我們想要的拓撲排序順序 (結果集里順序可能不唯一)

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;int main() {int n, m, s, t;cin >> n >> m;vector<int> inDegree(n, 0); // 記錄每個文件的入度unordered_map<int, vector<int>> umap; // 記錄文件依賴關系vector<int> result; // 記錄處理文件順序while (m--) {// s->t,先有s再有tcin >> s >> t;inDegree[t]++; // t入度+1umap[s].push_back(t); // 把s指向的文件放入對應的數組}queue<int> que;for (int i = 0; i < n; i++) {// 入度為0的文件,可以作為開頭,先加入隊列if (inDegree[i] == 0) que.push(i);}while (!que.empty()) {int cur = que.front(); // 當前入度為0的第一個文件que.pop(); // 彈出處理過的result.push_back(cur); // 處理過的放入結果集vector<int> files = umap[cur]; // 獲取該文件所指向的所有文件if (!files.empty()) { // 如果該節點有指向的文件for (int i = 0; i < files.size(); i++) {inDegree[files[i]]--; // 刪除節點 = 把cur指向的所有文件入度減一if (inDegree[files[i]] == 0) que.push(files[i]);}}}if (result.size() == n) {for (int i = 0; i < n - 1; i ++) {cout << result[i] << " ";}cout << result[n - 1] << endl;}else {cout << -1 << endl;}return 0;
}

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

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

相關文章

uniapp中vue3和pinia安裝依賴npm install失敗

目錄 一、問題描述 二、問題原因 三、問題解析及解決方案 一、問題描述 用uni-app開發小程序的時候&#xff0c;使用了vue3pinia,安裝依賴的時候發現vue和pinia的版本問題&#xff0c;安裝失敗&#xff0c; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…

2025認證杯第二階段數學建模B題:謠言在社交網絡上的傳播思路+模型+代碼

2025認證杯數學建模第二階段思路模型代碼&#xff0c;詳細內容見文末名片 一、引言 在當今數字化時代&#xff0c;社交網絡已然成為人們生活中不可或缺的一部分。信息在社交網絡上的傳播速度猶如閃電&#xff0c;瞬間就能觸及大量用戶。然而&#xff0c;這也為謠言的滋生和擴…

【C#】Thread.Join()、異步等待和直接join

JogThread.Join() 是 .NET 中 System.Threading.Thread 類的一個方法&#xff0c;用來讓當前調用線程暫停執行&#xff0c;直到目標線程&#xff08;這里是 JogThread&#xff09;終止為止。以下是它的核心語義和你在 UI 代碼里需要注意的幾個相關知識點。 1. Thread.Join() 的…

牛客網NC22012:判斷閏年問題詳解

牛客網NC22012&#xff1a;判斷閏年問題詳解 &#x1f4dd; 題目描述 題號&#xff1a;NC22012&#xff08;牛客網&#xff09; 時間限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他語言64 M 判斷一個…

鴻蒙開發——1.ArkTS聲明式開發(UI范式基本語法)

鴻蒙開發——1、ArkTS聲明式開發:UI范式基本語法 [TOC](鴻蒙開發——1、ArkTS聲明式開發:UI范式基本語法)一、ArkTS的基本組成&#xff08;1&#xff09;核心概念&#xff08;像貼標簽一樣控制組件&#xff09;&#xff08;2&#xff09;基礎工具包&#xff08;現成的積木塊&am…

【SPIN】PROMELA語言編程入門基礎語法(SPIN學習系列--1)

PROMELA&#xff08;Protocol Meta Language&#xff09;是一種用于描述和驗證并發系統的形式化建模語言&#xff0c;主要與SPIN&#xff08;Simple Promela Interpreter&#xff09;模型檢查器配合使用。本教程將基于JSPIN&#xff08;SPIN的Java圖形化版本&#xff09;&#…

Automatic Recovery of the Atmospheric Light in Hazy Images論文閱讀

Automatic Recovery of the Atmospheric Light in Hazy Images 1. 論文的研究目標與實際意義1.1 研究目標1.2 實際問題與產業意義2. 論文的創新方法、模型與公式2.1 方法框架2.1.1 方向估計(Orientation Estimation)2.1.2 幅值估計(Magnitude Estimation)2.2 與傳統方法的對…

基于微信小程序的在線聊天功能實現:WebSocket通信實戰

基于微信小程序的在線聊天功能實現&#xff1a;WebSocket通信實戰 摘要 本文將詳細介紹如何使用微信小程序結合WebSocket協議開發一個實時在線聊天功能。通過完整的代碼示例和分步解析&#xff0c;涵蓋界面布局、WebSocket連接管理、消息交互邏輯及服務端實現&#xff0c;適合…

速通:國際數字影像產業園園區服務體系

速通&#xff1a;國際數字影像產業園園區服務體系 國際數字影像產業園服務體系致力于構建全周期、多維度、高效率的產業賦能平臺&#xff0c;旨在優化營商環境&#xff0c;激發企業活力&#xff0c;推動數字影像產業集群化、高端化發展。 一、基礎運營與智慧管理服務 智慧化…

DeerFlow:字節新一代 DeepSearch 框架

項目地址&#xff1a;https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架構設計】獨家設計的 Research Team 機制&#xff0c;支持多輪對話、多輪決策和多輪任務執行。與 LangChain 原版 Supervisor 相比&#xff0c;顯著減少 Tokens 消耗和 API 調用次數&#…

MySQL 大表中添加索引的兩種常見方式及其優缺點分析

引言 在數據庫性能優化過程中&#xff0c;給大表添加索引是一項常見且重要的操作。由于大表數據量龐大&#xff0c;索引的創建過程往往涉及較高的系統開銷和復雜的操作流程。本文將介紹兩種在大表中添加索引的常見方法&#xff1a;直接添加索引和表復制方式&#xff0c;分別分…

Ubuntu系統掛載磁盤并配置開機自動掛載

今天買了個服務器然后掛載了一個500G的磁盤&#xff0c;但是登錄進去后發看不到&#xff0c;就是下面這樣的 只能看到100G的系統盤 rootecm-74de:/usr/local# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 3.1G 1.1M 3.1G 1% /run /dev/vda2 …

Android開發-Application

在Android應用開發中&#xff0c;Application類扮演著非常重要的角色。它作為整個應用程序的全局單例實例存在&#xff0c;在應用啟動時最先被創建&#xff0c;并且在整個應用生命周期內持續存在。通過自定義Application類&#xff0c;開發者可以執行全局初始化操作、管理全局狀…

邊緣計算平臺

本文來源 &#xff1a; 騰訊元寶 邊緣計算平臺是一種在靠近數據源頭的網絡邊緣側部署的分布式計算架構&#xff0c;通過融合網絡、計算、存儲和應用核心能力&#xff0c;就近提供實時、低延遲的智能服務。以下是其核心要點&#xff1a; ??1. 定義與特點?? ??定義??&a…

Spring 框架 JDBC 模板技術詳解

一、JDBC 模板技術概述 在傳統 JDBC 開發中&#xff0c;開發人員需要手動處理數據庫連接&#xff08;Connection&#xff09;、事務管理、語句執行&#xff08;Statement&#xff09;和結果集&#xff08;ResultSet&#xff09;等繁瑣操作&#xff0c;不僅代碼冗余度高&#x…

Axure難點解決分享:統計分析頁面引入Echarts示例動態效果

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:統計分析頁面引入Echarts示例動態效果 主要內容:echart示例引入、大小調整、數據導入 應用場景:統計分析頁面…

SpringBoot 數據校驗與表單處理:從入門到精通(萬字長文)

一、SpringBoot 數據驗證基礎 1.1 數據驗證的重要性 在現代Web應用開發中&#xff0c;數據驗證是保證系統安全性和數據完整性的第一道防線。沒有經過驗證的用戶輸入可能導致各種安全問題&#xff0c;如SQL注入、XSS攻擊&#xff0c;或者簡單的業務邏輯錯誤。 數據驗證的主要…

Ubuntu 22.04(WSL2)使用 Docker 安裝 Zipkin 和 Skywalking

Ubuntu 22.04&#xff08;WSL2&#xff09;使用 Docker 安裝 Zipkin 和 Skywalking 分布式追蹤工具在現代微服務架構中至關重要&#xff0c;它們幫助開發者監控請求在多個服務之間的流動&#xff0c;識別性能瓶頸和潛在錯誤。本文將指導您在 Ubuntu 22.04&#xff08;WSL2 環境…

python打卡day25@浙大疏錦行

知識點回顧&#xff1a; 1.異常處理機制 2.debug過程中的各類報錯 3.try-except機制 4.try-except-else-finally機制 在即將進入深度學習專題學習前&#xff0c;我們最后差缺補漏&#xff0c;把一些常見且重要的知識點給他們補上&#xff0c;加深對代碼和流程的理解。 作業&a…

鴻蒙OSUniApp 開發實時聊天頁面的最佳實踐與實現#三方框架 #Uniapp

使用 UniApp 開發實時聊天頁面的最佳實踐與實現 在移動應用開發領域&#xff0c;實時聊天功能已經成為許多應用不可或缺的組成部分。本文將深入探討如何使用 UniApp 框架開發一個功能完善的實時聊天頁面&#xff0c;從布局設計到核心邏輯實現&#xff0c;帶領大家一步步打造專…