BFS解決拓撲排序(3題)

目錄

拓撲排序

1.如何排序?

2.如何形成拓撲排序?

3.如何建圖

1.看數據稠密度

2. 根據算法流程靈活建圖

1.課程表

2.課程表2

3.火星詞典


拓撲排序

找到做事情的先后順序,拓撲排序的結果可能不是唯一的

1.如何排序?

1.找出圖中入度為0的點,然后輸出

2.刪除與該點連接的邊

3.重復1.2操作,直到圖中沒有點? ?或者? ?圖中沒有度為0的點為止(因為有可能有環)

2.如何形成拓撲排序?

?借助隊列,來一次bfs即可

1.初始化:把所有入度為0的點加入隊列中即可

2.當隊列不為空的時候:

a.拿出隊頭元素,加入到最終結果中

b.刪除與該元素相連的邊

c.判斷 與刪除邊相連的點,是否入度變成0

如果入度為0,加入到隊列中

3.如何建圖

我們應該靈活使用stl里面的容器

?

?

1.看數據稠密度

我們可以用鄰接矩陣和鄰接表

鄰接表我們可以使用vector嵌套vector,也可以使用哈希表,其中哈希表比較通用一些。

?

2. 根據算法流程靈活建圖

?比如要統計每個節點的入度 我們用一個vector<int> 來統計

1.課程表

?207. 課程表 - 力扣(LeetCode)

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {//1.準備工作unordered_map<int, vector<int>> edges;//鄰接表存圖vector<int> in(numCourses); // 標記每一個定義的入度//2.建圖for(auto& e: prerequisites){int a = e[0];int b = e[1];edges[b].push_back(a);in[a]++;}//3.拓撲排序queue<int> q;//a.把所有入度為0的點加入到隊列中for(int i = 0; i < numCourses; i++){if(in[i] == 0)q.push(i);}//b.bfswhile(q.size()){int t = q.front();q.pop();for(int a: edges[t]){in[a]--;if(in[a] == 0)q.push(a);}}//4.判斷是否有環for(int i = 0; i < numCourses; i++){if(in[i])return false;}return true;}
};

2.課程表2

LCR 113. 課程表 II - 力扣(LeetCode)

只需要在pop的時候把相應元素加入數組中即可

class Solution {
public:vector<int> findOrder(int n, vector<vector<int>>& prerequisites) {unordered_map<int, vector<int>> hash;vector<int> in(n,0);vector<int> ret;vector<int> ret2;for(auto e:prerequisites){int a = e[0];int b = e[1];//b->ahash[b].push_back(a);in[a]++;}queue<int> q;for(int i = 0; i < n; i++){if(in[i] == 0)q.push(i);}while(q.size()){int t = q.front();ret.push_back(t);q.pop();for(auto e: hash[t]){in[e]--;if(in[e] == 0)q.push(e);}}for(auto e: in){if(e)return ret2;}return ret;}
};

3.火星詞典

LCR 114. 火星詞典 - 力扣(LeetCode)?

如何搜集信息?兩層for循環

拓撲排序

1.建圖

我們采用兩層哈希嵌套hash<char, hash<char>> edges.

2.統計入度信息

hash<char, int> in

必須要初始化, 不然剛開始的時候找不到入度為0的值。(遍歷一下每個字符串即可)

3.如何收集信息

雙指針

4.細節問題

一些特殊子串一定是排在對應字符串前面的

出現下面這種情況 我們直接返回空

class Solution {unordered_map<char, unordered_set<char>> edges;//鄰接表存儲圖unordered_map<char, int> in; //統計入度bool cheak; // 處理邊界情況
public:string alienOrder(vector<string>& words) {//1.初始化哈希表 + 建圖for(auto& s: words){for(auto ch : s){in[ch] = 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(cheak)return "";}}//2.拓撲排序queue<char> q;for(auto& [a, b] : in){if(b == 0)q.push(a);}string ret;while(q.size()){char t = q.front();q.pop();ret += t;for(char ch: edges[t]){if(--in[ch] == 0)q.push(ch);}}//3.判斷for(auto& [a, b] : in){if(b != 0)return "";}return ret;}void add(string& s1, string& s2){int n = min(s1.size(), s2.size());int i = 0;for(;  i < n; i++){if(s1[i] != s2[i]){char a = s1[i];char b = s2[i];// a->bif(!edges.count(a) || !edges[a].count(b)){edges[a].insert(b);in[b]++;}break;}}if(i == s2.size() && i < s1.size())cheak = true;}
};

?

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

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

相關文章

kafka 3.5.0 raft協議安裝

前言 最近做項目&#xff0c;需要使用kafka進行通信&#xff0c;且只能使用kafka&#xff0c;筆者沒有測試集群&#xff0c;就自己搭建了kafka集群&#xff0c;實際上筆者在很早之前就搭建了&#xff0c;因為當時還是zookeeper&#xff08;簡稱ZK&#xff09;注冊元數據&#…

Unity項目接入xLua的一種流程

1. 導入xlua 首先導入xlua&#xff0c;這個不用多說 2. 編寫C#和Lua交互腳本 基礎版本&#xff0c;即xlua自帶的版本 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System; using System.IO;[Serializable] public…

四次揮手詳解

文章目錄 一、四次揮手各狀態FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、雙方同時調用close()&#xff0c;FIN_WAIT_1狀態后進入CLOSING狀態CLOSING狀態 三、TIME_WAIT狀態詳解(1) TIME_WAIT狀態下的2MSL是什么MSL &#xff08;報文最大生存時間&#xff09;為…

【嵌入式 Linux 音視頻+ AI 實戰項目】瑞芯微 Rockchip 系列 RK3588-基于深度學習的人臉門禁+ IPC 智能安防監控系統

前言 本文主要介紹我最近開發的一個個人實戰項目&#xff0c;“基于深度學習的人臉門禁 IPC 智能安防監控系統”&#xff0c;全程滿幀流暢運行。這個項目我目前全網搜了一圈&#xff0c;還沒發現有相關類型的開源項目。這個項目只要稍微改進下&#xff0c;就可以變成市面上目前…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 創建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…

解決錯誤:CondaHTTPError: HTTP 000 CONNECTION FAILED for url

解決錯誤&#xff1a;CondaHTTPError: HTTP 000 CONNECTION FAILED for url 查看channels:vim ~/.condarcshow_channel_urls: true channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/…

Apache APISIX 快速入門

文章目錄 apisix 快速入門什么是apisix有了 NGINX 和 Kong&#xff0c;為什么還需要 Apache APISIX&#xff1f;軟件架構基于 Nginx 開源版本&#xff0c;而 Nginx 并不支持動態配置&#xff0c;為什么 Apache APISIX 聲稱自己可以實現動態配置&#xff1f; 安裝配置 APISIX配置…

2025嵌入式高頻面試題解析

一、概述 到了年初&#xff0c;是求職者最活躍的時間。本文梳理了嵌入式高頻面試題&#xff0c;幫助求職者更好地準備面試&#xff0c;同時也為技術愛好者提供深入學習嵌入式知識的參考。 二、C 語言基礎 2.1 指針與數組 問題 1&#xff1a;指針和數組的區別是什么&#xf…

1.攻防世界 baby_web

題目描述這里有提示&#xff0c;初始頁面 進入題目頁面如下 很簡潔的頁面只有一行HELLO WORLD ctrlu查看了源碼也沒有信息 用burp suite抓包&#xff0c;并發送到重放器 根據提示&#xff08;初始頁面&#xff09;修改訪問index.php文件 index.php index.php 是一種常見的…

什么是三層交換技術?與二層有什么區別?

什么是三層交換技術&#xff1f;讓你的網絡飛起來&#xff01; 一. 什么是三層交換技術&#xff1f;二. 工作原理三. 優點四. 應用場景五. 總結 前言 點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子都在歌唱 大家好…

【機器學習】數據預處理之數據歸一化

數據預處理之數據歸一化 一、摘要二、數據歸一化概念三、數據歸一化實現方法3.1 最值歸一化方法3.2 均值方差歸一化方法 一、摘要 本文主要講述了數據歸一化&#xff08;Feature Scaling&#xff09;的重要性及其方法。首先通過腫瘤大小和發現時間的例子&#xff0c;說明了不同…

【AIGC】語言模型的發展歷程:從統計方法到大規模預訓練模型的演化

博客主頁&#xff1a; [小????????] 本文專欄: AIGC | ChatGPT 文章目錄 &#x1f4af;前言&#x1f4af;語言模型的發展歷程&#xff1a;從統計方法到大規模預訓練模型的演化1 統計語言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;統…

高效知識管理與分類優化指南:從目錄設計到實踐應用

摘要 本文旨在幫助讀者在信息爆炸時代構建高效的知識管理體系&#xff0c;提供了知識收藏目錄、瀏覽器書簽和電腦文件夾的優化分類方案。知識收藏目錄方案包括工作與項目、記錄與日常、知識管理等八大類&#xff0c;具有邊界清晰、擴展靈活、貼合實際場景等優勢。瀏覽器書簽分類…

OpenAI 實戰進階教程 - 第十二節 : 多模態任務開發(文本、圖像、音頻)

適用讀者與目標 適用讀者&#xff1a;已經熟悉基礎的 OpenAI API 調用方式&#xff0c;對文本生成或數據處理有一定經驗的計算機從業人員。目標&#xff1a;在本節中&#xff0c;你將學會如何使用 OpenAI 提供的多模態接口&#xff08;圖像生成、語音轉錄等&#xff09;開發更…

Java面試題2025-JVM

JVM 1.為什么需要JVM&#xff0c;不要JVM可以嗎&#xff1f; 1.JVM可以幫助我們屏蔽底層的操作系統 一次編譯&#xff0c;到處運行 2.JVM可以運行Class文件 2.JDK&#xff0c;JRE以及JVM的關系 3.我們的編譯器到底干了什么事&#xff1f; 僅僅是將我們的 .java 文件轉換成了…

Deepseek的MLA技術原理介紹

DeepSeek的MLA(Multi-head Latent Attention)技術是一種創新的注意力機制,旨在優化Transformer模型的計算效率和內存使用,同時保持模型性能。以下是MLA技術的詳細原理和特點: 1. 核心思想 MLA技術通過低秩聯合壓縮技術,將多個注意力頭的鍵(Key)和值(Value)映射到一…

QML初識

目錄 一、關于QML 二、布局定位和錨點 1.布局定位 2.錨點詳解 三、數據綁定 1.基本概念 2.綁定方法 3.數據模型綁定 四、附加屬性及信號 1.附加屬性 2.信號 一、關于QML QML是Qt框架中的一種聲明式編程語言&#xff0c;用于描述用戶界面的外觀和行為&#xff1b;Qu…

java項目之美妝產品進銷存管理系統的設計與開發源碼(ssm+mysql)

項目簡介 美妝產品進銷存管理系統的設計與開發實現了以下功能&#xff1a; 美妝產品進銷存管理系統的設計與開發的主要使用者分為管理員登錄后修改個人的密碼。產品分類管理中&#xff0c;對公司內的所有產品分類進行錄入&#xff0c;也可以對產品分類進行修改和刪除。產品管…

Python(pymysql包)操作MySQL【增刪改查】

下載pymysql&#xff1a; pip install pymysql 在MySQL中創建數據庫&#xff1a;unicom create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use unicom; 在unicom中創建數據表&#xff1a;admin create table admin(id int not null primary key auto_i…

日志2025.2.9

日志2025.2.9 1.增加了敵人揮砍類型 2.增加了敵人的死亡狀態 在敵人身上添加Ragdoll&#xff0c;死后激活布偶模式 public class EnemyRagdoll : MonoBehaviour { private Rigidbody[] rigidbodies; private Collider[] colliders; private void Awake() { rigidbodi…