BFS算法篇——打開智慧之門,BFS算法在拓撲排序中的詩意探索(下)

文章目錄

  • 引言
  • 一、課程表
    • 1.1 題目鏈接:https://leetcode.cn/problems/course-schedule/description/
    • 1.2 題目分析:
    • 1.3 思路講解:
    • 1.4 代碼實現:
  • 二、課程表||
    • 2.1 題目鏈接:https://leetcode.cn/problems/course-schedule-ii/description/
    • 2.2 題目分析:
    • 2.3 思路講解:
    • 2.4 代碼實現:
  • 三、火星詞典
    • 3.1 題目鏈接:https://leetcode.cn/problems/Jf1JuT/description/
    • 3.2 題目分析:
    • 3.3 思路講解:
    • 3.4 代碼實現:
  • 小結

在這里插入圖片描述

引言

上篇我們介紹了BFS解決拓撲排序的背景知識,本篇我們將結合具體題目分析,進一步深化對于該算法的理解運用。

一、課程表

1.1 題目鏈接:https://leetcode.cn/problems/course-schedule/description/

1.2 題目分析:

  • numCourses 表示要學的課程的數量
  • prerequisites[i] = [ai, bi] ,表示如果要學習課程 ai 則 必須 先學習課程 bi 。
  • 如果存在能按照順序學完的可能,返回true,否則返回false

1.3 思路講解:

該題為一個明顯的拓撲排序問題,根據上篇講解,我們可以這樣子處理

  • 首先構建鄰接表,先決條件pre表示的順序即為b->a,作為邊加入其中
  • 同時,由于學習a之前必須要學習b,因此a的入度加1
  • 之后將入度為0的節點入隊列,層序遍歷即可

1.4 代碼實現:

class Solution {
public:bool canFinish(int n, vector<vector<int>>& prerequisites) {unordered_map<int,vector<int>> edges;//鄰接表vector<int> in(n);//入度//建圖for(auto e: prerequisites){int a=e[0],b=e[1];edges[b].push_back(a);in[a]++;}queue<int> q;//將入度為0的節點入隊列for(int i=0;i<n;i++){if(in[i]==0){q.push(i);}}//層序遍歷while(q.size()){int t=q.front();q.pop();for(int e : edges[t]){in[e]--;if(in[e]==0){q.push(e);}}}for(int i=0;i<n;i++){if(in[i]){return false;}//說明無法學完所有課程}return true;}
};

二、課程表||

2.1 題目鏈接:https://leetcode.cn/problems/course-schedule-ii/description/

2.2 題目分析:

該題與上題要求基本相同,只是返回值要求返回可能的一種學習順序,如果不存在,則返回空數組

2.3 思路講解:

判斷是否可以學習的思路與上題相同,我們只需要在層序遍歷時,用一個數組記錄當前學習順序即可。

2.4 代碼實現:

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {unordered_map<int,vector<int>> edges;//鄰接表vector<int> in(numCourses);//入度vector<int> ret;//返回值vector<int> temp;//空數組queue<int> q;//建圖for(auto e:prerequisites){int a=e[0],b=e[1];edges[b].push_back(a);in[a]++;}//入度為0的節點入隊列for(int i=0;i<numCourses;i++){if(in[i]==0){q.push(i);}}while(q.size()){int t=q.front();q.pop();ret.push_back(t);//更新結果for(int e:edges[t]){in[e]--;if(in[e]==0){q.push(e);}}}for(int i=0;i<numCourses;i++){if(in[i]){return temp;}}//存在未完成情況,返回空數組return ret;}
};

三、火星詞典

3.1 題目鏈接:https://leetcode.cn/problems/Jf1JuT/description/

3.2 題目分析:

題目要求一時間難以讀懂,我們來簡單翻譯一下:

  • 給定的word里面已經按一種新的字母順序排列好

假設 words = [“wrt”,“wrf”,“er”,“ett”,“rftt”],我們可以得到字母之間的一些依賴關系:

  • 比如從 “wrt” 和 “wrf” 可以得出 t 在 f 之前(因為 “t” 是兩個單詞中的不同字母,且在相同位置上不同)。

  • 從 “er” 和 “ett” 中可以得出 r 在 e 之前。

最終需要返回題目中外星詞典的遞增順序,若不存在合法的順序,則返回空

3.3 思路講解:

我們通過比較相鄰的單詞,找出它們的第一個不同字母。這些字母的順序關系就可以幫助我們構建字母的順序圖。

圖的構建:

  • 我們可以通過圖來表示字母之間的順序關系。每個字母是圖中的一個節點,而字母之間的順序關系是邊。

拓撲排序:

  • 通過拓撲排序的方法,我們可以得到字母的正確排序。如果有環,則說明字母順序無法確定,返回空字符串。

3.4 代碼實現:

class Solution {
public:unordered_map<char,unordered_set<char>> edges;//邊unordered_map<char,int> in;//入度bool check;//處理特殊情況void add(string& s1,string& s2){int n=min(s1.size(),s2.size());int i;for( i=0;i<n;i++){if(s1[i]!=s2[i]){char a=s1[i],b=s2[i];if(!edges.count(a) || !edges[a].count(b))//如果之前為記錄過,則記錄這條邊a->b{edges[a].insert(b);in[b]++;//更新邊和入度節點}break;//注意跳出循環}}if(i==s2.size()&&i<s1.size())//處理abc ab這種特殊情況{check=true;}}string alienOrder(vector<string>& words) {//建圖和初始化for(auto e: words){for(auto ch:e){in[ch]=0;}//將所有字符的入度都初始化為0}int n=words.size();for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){add(words[i],words[j]);if(check){return "";//存在非法情況}}}//拓撲排序queue<char> q;string ret;//將所有入度為0的節點for(auto [a,b] :in){if(b==0){q.push(a);}}while(q.size()){char t=q.front();q.pop();ret+=t;for(auto e:edges[t]){if(--in[e]==0) q.push(e);}}for(auto [a,b] :in){if(b!=0){return "";}}//判斷是否存在不合法順序return ret;}
};

小結

本篇關于BFS解決拓撲排序的講解就暫告段落啦,希望能對大家的學習產生幫助,歡迎各位佬前來支持斧正!!!

在這里插入圖片描述

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

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

相關文章

計數循環java

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int count 10;while(count > 0) {count count -1;System.out.println(count);}System.out.println(count);System.out.println("發射&am…

11. CSS從基礎樣式到盒模型與形狀繪制

在前端開發中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;是控制網頁樣式和布局的核心技術。整理了關于 CSS 基礎樣式、文本樣式、盒模型以及形狀繪制的一些心得。以下是詳細的學習筆記。 一、基礎樣式設置 1. 字體樣式 字體樣式是網頁視覺呈現的重要組成部分&#xf…

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題

雙種群進化算法&#xff1a;動態約束處理與資源分配解決約束多目標優化問題 一、引言 約束多目標優化問題&#xff08;CMOPs&#xff09;在工程設計、資源分配等領域廣泛存在&#xff0c;其核心是在滿足多個約束條件的同時優化多個目標函數。傳統方法往往難以平衡約束滿足與目…

【Qt】pro工程文件轉CMakeLists文件

1、簡述 Qt6以后默認使用cmake來管理工程,之前已經一直習慣使用pro,pro的語法確實很簡單、方便。 很多項目都是cmake來管理,將它們加入到Qt項目中,cmake確實是大勢所趨。比如,最近將要開發的ROS項目,也是使用的cmake語法。 以前總結的一些Qt代碼,已經編寫成pro、pri等…

手機換地方ip地址會變化嗎?深入解析

在移動互聯網時代&#xff0c;我們經常帶著手機穿梭于不同地點&#xff0c;無論是出差旅行還是日常通勤。許多用戶都好奇&#xff1a;當手機更換使用地點時&#xff0c;IP地址會隨之改變嗎&#xff1f;本文將深入解析手機IP地址的變化機制&#xff0c;幫助您全面了解這一常見但…

【Canda】常用命令+虛擬環境創建到選擇

目錄 一、conda常用命令 二、conda 環境 2.1 創建虛擬環境 2.2 conda環境切換 2.3 查看conda環境 2.4 刪除某個conda環境 2.5 克隆環境 三、依賴包管理 3.1 安裝命令 3.2 更新包 3.3 卸載包 3.4 查看環境中所有包 3.5 查看某個包的版本信息 3.6 搜索包 四、環境…

目標檢測任務常用腳本1——將YOLO格式的數據集轉換成VOC格式的數據集

在目標檢測任務中&#xff0c;不同框架使用的標注格式各不相同。常見的框架中&#xff0c;YOLO 使用 .txt 文件進行標注&#xff0c;而 PASCAL VOC 則使用 .xml 文件。如果你需要將一個 YOLO 格式的數據集轉換為 VOC 格式以便適配其他模型&#xff0c;本文提供了一個結構清晰、…

Python作業練習2

任務簡述 if_name__main_的含義&#xff0c;why? 問題解答 在Python中&#xff0c;if __name__ __main__:是一種常見的慣用法&#xff0c;用于檢查當前模塊是否是主程序入口點。要理解其含義和用途&#xff0c;首先需要了解兩個概念&#xff1a; 1. __name__: 這是一個特…

ppy/osu構建

下載 .NET (Linux、macOS 和 Windows) | .NET dotnet還行 構建&#xff1a;f5 運行&#xff1a;dotnet run --project osu.Desktop -c Debug

NY182NY183美光固態顆粒NY186NY188

NY182NY183美光固態顆粒NY186NY188 在存儲技術的競技場上&#xff0c;美光科技&#xff08;Micron&#xff09;始終扮演著革新者的角色。其NY系列固態顆粒憑借前沿的3D NAND架構和精準的工藝控制&#xff0c;成為企業級存儲和數據中心的關鍵支柱。本文將圍繞NY182、NY183、NY1…

C++的歷史與發展

目錄 一、C 的誕生與早期發展 &#xff08;一&#xff09;C 語言的興起與局限 &#xff08;二&#xff09;C 的雛形&#xff1a;C with Classes &#xff08;三&#xff09;C 命名與早期特性豐富 二、C 的主要發展歷程 &#xff08;一&#xff09;1985 年&#xff1a;經典…

DedeCMS-Develop-5.8.1.13-referer命令注入研究分析 CVE-2024-0002

本次文章給大家帶來代碼審計漏洞挖掘的思路&#xff0c;從已知可控變量出發或從函數功能可能照成的隱患出發&#xff0c;追蹤參數調用及過濾。最終完成代碼的隱患漏洞利用過程。 代碼審計挖掘思路 首先flink.php文件的代碼執行邏輯&#xff0c;可以使用php的調試功能輔助審計 …

計算機網絡|| 常用網絡命令的作用及工作原理

1.hostname 作用&#xff1a;顯示計算機的完整計算機名的主機名部分。僅當 Internet 協議 (TCP/IP) 協議作為組件安裝在網絡的網絡適配器的屬性中時&#xff0c;此命令才可用。 2.ping 作用&#xff1a; 1.用來檢測網絡的連通情況和分析網絡速度 2.根據域名得到服務器 IP …

用戶態到內核態:Linux信號傳遞的九重門(二)

1. 保存信號 1.1. 信號其他相關常見概念 實際執?信號的處理動作稱為信號遞達(Delivery)。 信號從產?到遞達之間的狀態,稱為信號未決(Pending)。 進程可以選擇阻塞 (Block )某個信號。 被阻塞的信號產?時將保持在未決狀態,直到進程解除對此信號的阻塞,才執?遞達的動作。 1.…

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/這個代碼的解釋

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/ 這條命令的解釋如下&#xff1a; 1. tar&#xff1a;這是 Linux 系統中用于歸檔和壓縮文件的命令行工具。 2. -z&#xff1a;表示通過 gzip 壓縮格式來處理文件&#xff0c;因為文件 jdk-8u212-linux-x64.tar.gz 是一個經…

SysAid On-Prem XML注入漏洞復現(CVE-2025-2776)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

Nginx的增強與可視化!OpenResty Manager - 現代化UI+高性能反向代理+安全防護

以下是對OpenResty Manager的簡要介紹&#xff1a; OpenResty Manager &#xff08;Nginx 增強版&#xff09;&#xff0c;是一款容易使用、功能強大且美觀的反向代理工具 &#xff0c;可以作為OpenResty Edge 的開源替代品基于 OpenResty 開發&#xff0c;支持并繼承 OpenRes…

旅游推薦數據分析可視化系統——訊飛AI助手(超級v2版本)+論文+數據+源碼

旅游推薦數據分析可視化系統——訊飛AI助手(超級v2版本)論文數據源碼 項目介紹 本項目是一個基于Django框架開發的旅游推薦數據分析可視化系統&#xff0c;集成了訊飛AI大模型助手功能。系統通過對去哪兒網的旅游數據進行采集、分析和可視化&#xff0c;為用戶提供個性化的旅…

大疆無人機(全系列,包括mini)拉流至電腦,實現直播

參考視頻 【保姆級教程】大疆無人機rtmp推流直播教程_嗶哩嗶哩_bilibili VLC使用教程&#xff1a; VLC工具使用指南-CSDN博客 目錄 實現效果&#xff1a; 電腦端 ?編輯 ?編輯 無人機端 VLC拉流 分析 實現效果&#xff1a; (實驗機型&#xff1a;大疆mini4kRC-N2遙控器、大…

windows系統使用phpstudy安裝ssl證書

一、證書準備與上傳 獲取證書文件? 免費證書&#xff08;如阿里云、Lets Encrypt&#xff09;&#xff1a;下載包含.crt&#xff08;證書&#xff09;、.key&#xff08;私鑰&#xff09;、chain.crt&#xff08;證書鏈&#xff09;的文件包 自簽名證書&#xff08;測試用&a…