力扣75——圖深度優先搜索

總結leetcode75中的圖深度優先搜索算法題解題思路。
上一篇:力扣75——二叉搜索樹

力扣75——圖深度優先搜索

  • 1 鑰匙和房間
  • 2 省份數量
  • 3 重新規劃路線
  • 4 除法求值
  • 1-4 解題總結

1 鑰匙和房間

題目:

有 n 個房間,房間按從 0 到 n - 1 編號。最初,除 0 號房間外的其余所有房間都被鎖住。
你的目標是進入所有的房間。然而,你不能在沒有獲得鑰匙的時候進入鎖住的房間。當你進入一個房間,你可能會在里面找到一套不同的鑰匙,每把鑰匙上都有對應的房間號,
即表示鑰匙可以打開的房間。你可以拿上所有鑰匙去解鎖其他房間。給你一個數組 rooms 其中 rooms[i] 是你進入 i 號房間可以獲得的鑰匙集合。如果能進入
所有 房間返回 true,否則返回 false

題解:
我的方法:廣度優先搜索。進入一個房間t,拿到里面的鑰匙tmp,然后把鑰匙tmp壓入隊列q中。while循環隊列q拿鑰匙,直到q空了為止。最后檢查所有房間visit是否都被訪問。
官方代碼:深度優先搜索。利用遞歸函數dfs:進入一個房間,拿到鑰匙,再用for循環調用dfs函數。

class Solution {
public:bool canVisitAllRooms(vector<vector<int>>& rooms) {int numRooms = rooms.size();vector<int> visit(numRooms,0);visit[0] = 1;vector<int> tmp;queue<int> q;q.push(0);while (!q.empty()) {tmp = rooms[q.front()];q.pop();if (!tmp.empty()) {for (int t : tmp) {if (visit[t] == 1)continue;q.push(t);visit[t] = 1;}}}for (int v : visit) {if (v == 0) return false;}return true;}
};
//官方的代碼更簡潔合理
/*
class Solution {
public:vector<int> vis;int num;void dfs(vector<vector<int>>& rooms, int x) {vis[x] = true;num++;for (auto& it : rooms[x]) {if (!vis[it]) {dfs(rooms, it);}}}bool canVisitAllRooms(vector<vector<int>>& rooms) {int n = rooms.size();num = 0;vis.resize(n);dfs(rooms, 0);return num == n;}
};
*/

2 省份數量

題目:

有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,
且城市 b 與城市 c 直接相連,那么城市 a 與城市 c 間接相連。省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。給你一個 n x n 的矩陣 isConnected ,其中 isConnected[i][j] = 1 表示第 i 個城市和
第 j 個城市直接相連,而 isConnected[i][j] = 0 表示二者不直接相連。返回矩陣中 省份 的數量。

題解:
深度優先搜索for遍歷每個城市,用遞歸函數dfs找到所有與當前城市i直接或間接相連的城市,用visit來標記已經搜索過的城市。

class Solution {
public:int findCircleNum(vector<vector<int>>& isConnected) {int nums = 0, nC = isConnected.size();vector<int> visit(nC, 0);for (int i = 0; i < nC; i++) {if (visit[i] == 0) {nums++;dfs(isConnected, visit, i);}}return nums;}void dfs(vector<vector<int>>& isConnected,vector<int> & visit,int i) {visit[i] = 1;for (int j = 0; j < isConnected.size(); j++) {if (isConnected[i][j] == 1&& visit[j] == 0) {dfs(isConnected, visit, j);}}}
};

3 重新規劃路線

題目:

n 座城市,從 0 到 n-1 編號,其間共有 n-1 條路線。因此,要想在兩座不同城市之間旅行只有
唯一一條路線可供選擇(路線網形成一顆樹)。去年,交通運輸部決定重新規劃路線,以改變交通
擁堵的狀況。路線用 connections 表示,其中 connections[i] = [a, b] 表示從城市 a 到 b 的一條有向
路線。今年,城市 0 將會舉辦一場大型比賽,很多游客都想前往城市 0 。
請你幫助重新規劃路線方向,使每個城市都可以訪問城市 0 。返回需要變更方向的最小路線數。
題目數據 保證 每個城市在重新規劃路線方向后都能到達城市 0

題解:
廣度優先搜索。目的是將所有路線的方向都朝著城市0,所以遍歷所有與城市0直接相連的城市,然后對這每一個相連的城市進行廣度優先搜索,更改那些方向錯誤的路線。具體的過程在代碼中有注釋。

class Solution {
public:int minReorder(int n, vector<vector<int>>& connections) {vector<vector<int>> conn_idx(n, vector<int>());//這里使用了類似于鄰接表的方法,將和節點有關的連接的id序號加入到對應的向量中//這樣在后面遍歷的時候,只要查找connections里面對應的id即可//要注意這里連接兩端都加入了連接的序號for (int i = 0; i < connections.size(); i++) {conn_idx[connections[i][0]].push_back(i);conn_idx[connections[i][1]].push_back(i);}vector<bool> vi(connections.size(), false);//此處標志的是某條邊是否被訪問過,而不是某個點是否被訪問過int ans = 0;queue<int> que;que.push(0);while (!que.empty()) {auto q = que.front();que.pop();//這個循環是對和節點q相關的連接進行遍歷,通過上面存儲的連接的id進行遍歷for (auto idx : conn_idx[q]) {if (vi[idx]) continue;vi[idx] = true;int a = connections[idx][0];//連接的起始int b = connections[idx][1];//連接的終點ans += (a == q);//如果當前點是出的,那么要修改為入,ans++a = (a == q) ? b : a;que.push(a);}}return ans;}
};

4 除法求值

題目:

給你一個變量對數組 equations 和一個實數值數組 values 作為已知條件,其中 equations[i] 
= [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每個 Ai 或 Bi 是一個表示
單個變量的字符串。
另有一些以數組 queries 表示的問題,其中 queries[j] = [Cj, Dj] 表示第 j 個問題,請你根
據已知條件找出 Cj / Dj = ? 的結果作為答案。返回 所有問題的答案 。如果存在某個無法確定的答案,則用 -1.0 替代這個答案。如果問題中出現
了給定的已知條件中沒有出現的字符串,也需要用 -1.0 替代這個答案。注意:輸入總是有效的。你可以假設除法運算中不會出現除數為 0 的情況,且不存在任何矛盾的結果。
注意:未在等式列表中出現的變量是未定義的,因此無法確定它們的答案。

題解:
并查集
1 先定義1個unordered_map類型的parent,它記錄了一個數的被除數,被除數的被除數是它自己。
2 再定義1個unordered_map類型的mp,記錄1個數除被除數得到的值。
3 接著定義函數find(),該函數可以找到一個數的祖先。在這個過程中,如果發現一個數的祖先跟它隔了2代或更多代,就遞歸進行壓縮,并修改對應的mp值。
4 然后,通過for循環遍歷equations,將所以除法公式及其結果記錄好。
5 最后,計算queries中的問題。如果被除數或除數不存在于parent中,則無法求解;如果除數和被除數的祖先不是同一個,也無法求解;如果除數和被除數是同一個祖先,則直接用它們的mp值做除法即可。

class Solution {
public:unordered_map<string, string> parent;unordered_map<string, double> mp;string find(string x){if(parent[x] == x)  return x;string px = parent[x];string res =  parent[x] = find(parent[x]);    mp[x] *= mp[px];return res;}vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {int n = equations.size();for(int i = 0; i < n; i ++ ){string a = equations[i][0], b = equations[i][1];double v = values[i];if(parent.find(a) == parent.end() && parent.find(b) == parent.end()){parent[a] = a; parent[b] = a;mp[b] = v, mp[a] = 1.0;}else if(parent.find(a) == parent.end()){parent[a] = a; string pb = find(b);mp[a] = 1.0;mp[pb] = v / mp[b];parent[pb] = a;}else if(parent.find(b) == parent.end()){parent[b] = a;mp[b] = v;}else{string pa = find(a), pb = find(b);if(pa == pb)    continue;parent[pb] = pa;mp[pb] = mp[a] * v / mp[b];} }vector<double> res;for(auto &item : queries){string a = item[0], b = item[1];if(parent.find(a) == parent.end() || parent.find(b) == parent.end())    res.push_back(-1.0);else{string pa = find(a), pb = find(b);if(pa != pb)    res.push_back(-1.0);else    res.push_back(mp[b] / mp[a]);}}return res;}
};

1-4 解題總結

a 題目類型總結:

  • 題目1:從1個節點出發,是否可以到達所有節點。
  • 題目2:所有節點構成幾個連通域。
  • 題目3:從任意節點出發,是否可以到達某個節點。
  • 題目4:節點1是否可以到達節點2。

b 題目1和題目3本質上是一樣的,只是邊的方向相反了而已。他們既可以使用深度優先搜索,也可以使用廣度優先搜索。
c 題目2既可以使用深度優先搜索,也可以使用廣度優先搜索。
d 題目4是檢查兩個點之間是否連通,所以,用深度優先搜索更合適。
e 這些題目不限制是否會重復經過某個節點,只考慮哪些節點是相通的。

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

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

相關文章

【Matter】基于Ubuntu 22.04搭建matter開發環境:chip-tool 配網之 matter-over-wifi

前言 主要是記錄一下學習過程&#xff0c;梳理下思路&#xff0c;拋轉~ 官方的開發環境&#xff0c;基于Linux版本&#xff0c;官方的環境是基于樹莓派環境的&#xff0c;原理其實也比較明了&#xff0c;目的也比較明確&#xff0c;就是達到Linux 主機和wifi 路由在同一局域網…

SpringBoot攜帶Jre綠色部署項目

文章目錄 SpringBoot攜帶Jre綠色部署運行項目1. 實現步驟2. 自測項目文件目錄及bat文件內容&#xff0c;截圖如下&#xff1a;2-1 項目文件夾列表&#xff1a;2-2. bat內容 3. 擴展&#xff1a; 1.6-1.8版本的jdk下載 SpringBoot攜帶Jre綠色部署運行項目 說明&#xff1a; 實…

256創作紀念日

不知不覺已經是寫博客的第256天了&#xff0c;從一個躺平的人變成一個為一件事能堅持并不斷去做是真的很爽&#xff0c;回過頭看看自己&#xff0c;寫了好多東西&#xff0c;也慢慢在成長&#xff0c;不再是以前那個只會玩的小孩了。 1、自我介紹 我是來自西安的一名準大三學…

Data Abstract for .NET and Delphi Crack

Data Abstract for .NET and Delphi Crack .NET和Delphi的數據摘要是一套或RAD工具&#xff0c;用于在.NET、Delphi和Mono中編寫多層解決方案。NET和Delphi的數據摘要是一個套件&#xff0c;包括RemObjects.NET和Delphi版本的數據摘要。RemObjects Data Abstract允許您創建訪問…

easyx圖形庫基礎4:貪吃蛇

貪吃蛇 一實現貪吃蛇&#xff1a;1.繪制網格&#xff1a;1.繪制蛇&#xff1a;3.控制蛇的默認移動向右&#xff1a;4.控制蛇的移動方向&#xff1a;5.生成食物6.判斷蛇吃到食物并且長大。7.判斷游戲結束&#xff1a;8.重置函數&#xff1a; 二整體代碼&#xff1a; 一實現貪吃蛇…

【golang】結構體及其方法的使用(struct)

函數是獨立的程序實體。我們可以聲明有名字的函數&#xff0c;也可以聲明沒名字的函數&#xff0c;還可以把它們當做普通的值傳來傳去。我們能把具有相同簽名的函數抽象成獨立的函數類型&#xff0c;以作為一組輸入、輸出&#xff08;或者說一類邏輯組件&#xff09;的代表。 …

爬蟲逆向實戰(八)--猿人學第十五題

一、數據接口分析 主頁地址&#xff1a;猿人學第十五題 1、抓包 通過抓包可以發現數據接口是api/match/15 2、判斷是否有加密參數 請求參數是否加密&#xff1f; 查看“載荷”模塊可以發現有一個m加密參數 請求頭是否加密&#xff1f; 無響應是否加密&#xff1f; 無cook…

CSS中的z-index屬性有什么作用?如何控制元素在層疊上下文中的顯示順序?

聚沙成塔每天進步一點點 ? 專欄簡介? z-index 屬性的作用及控制元素層疊順序作用 ? 控制元素層疊順序? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff0…

管理類聯考——邏輯——真題篇——按知識分類——匯總篇——一、形式邏輯——選言——不相容選言——要么

第三節 不相容選言-要么-“要么A要么B”→A和B有且僅有一個 真題(2010-39)-不相容選言-要么-“要么A要么B”→A和B有且僅有一個 39.大小行星懸浮游在太陽系邊緣,極易受附近星體引力作用的影響。據研究人員計算,有時這些力量會將彗星從奧爾特星云拖出。這樣,它們更有可能…

WPF國際化的實現方法(WpfExtensions.Xaml)

https://blog.csdn.net/eyupaopao/article/details/120090431 resx資源文件實現 resx資源文件&#xff0c;實現的過程比第一種復雜&#xff0c;但resx文件本身編輯比較簡單&#xff0c;維護起來比較方便。需要用到的框架&#xff1a;WpfExtensions.Xaml 為每種語言添加.resx資…

Mac思維導圖軟件Xmind for Mac中文激活版

好的思維導圖軟件能幫助用戶更好的發揮創作能力&#xff0c;XMind是一款流行的思維導圖軟件&#xff0c;可以幫助用戶創建各種類型的思維導圖和概念圖。 多樣化的導圖類型&#xff1a;XMind提供了多種類型的導圖&#xff0c;如魚骨圖、樹形圖、機構圖等&#xff0c;可以滿足不同…

UI自動化測試常見的Exception

一. StaleElementReferenceException&#xff1a; - 原因&#xff1a;引用的元素已過期。原因是頁面刷新了&#xff0c;此時當然找不到之前頁面的元素。- 解決方案&#xff1a;不確定什么時候元素就會被刷新。頁面刷新后重新獲取元素的思路不變&#xff0c;這時可以使用python的…

ClickHouse(二十二):Clickhouse SQL DML操作及導入導出數據

進入正文前&#xff0c;感謝寶子們訂閱專題、點贊、評論、收藏&#xff01;關注IT貧道&#xff0c;獲取高質量博客內容&#xff01; &#x1f3e1;個人主頁&#xff1a;含各種IT體系技術&#xff0c;IT貧道_Apache Doris,大數據OLAP體系技術棧,Kerberos安全認證-CSDN博客 &…

GPT-5出世?OpenAI GPT-5商標已注冊

OpenAI的GPT已經成為了業界標桿&#xff0c;升級速度之快讓人瞠目&#xff0c;別人追GPT-3.5的時候GPT-4橫空出世&#xff0c;差距被拉開了&#xff0c;現在GPT-5就要來了。 據商標律師泄露的消息&#xff0c;OpenAI已于7月18日注冊了GPT-5商標。雖然注冊商標并不罕見&#xf…

【【萌新的STM32學習-9】】

萌新的STM32學習-9 我們在使用某個外設&#xff0c;必須線使能該外設時鐘 SYSTEM 文件夾里面的代碼由正點原子提供&#xff0c;是 STM32F1xx 系列的底層核心驅動函數&#xff0c; 可以用在 STM32F1xx 系列的各個型號上面&#xff0c;方便大家快速構建自己的工程。本章&#xf…

基于IMX6ULLmini的linux裸機開發系列二:使用C語言和SDK點亮LED

引入sdk頭文件 sudo chown -R gec /opt 用這條命令給gec賦權限&#xff0c;否則訪問權限不夠&#xff0c;無法讀取&#xff0c;如下圖成功 目的&#xff1a;解決寄存器地址難查難設置 devices/MCIMX6Y2/MCIMX6Y2.h 記錄外設寄存器及其相關操作 devices/MCIMX6Y2/drivers/fsl_…

Windows+VMware+Ubuntu+Anaconda+VMware Tools

Q1&#xff1a;Windows不支持***agent模擬器 A1&#xff1a;在VMware安裝Ubuntu虛擬機 P1: 下載 VMware-workstation-full-15.5.6-16341506.exe 安裝包&#xff08;峰哥電腦軟件&#xff09; P2: 下載Ubuntu鏡像 地址 ubuntu-18.04.6-desktop-amd64.iso P3&#xff1a;搭載鏡…

干翻Dubbo系列第十一篇:Dubbo常見協議與通信效率對比

文章目錄 文章說明 一&#xff1a;協議 1&#xff1a;什么是協議 2&#xff1a;協議和序列化關系 3&#xff1a;協議組成 &#xff08;一&#xff09;&#xff1a;頭信息 &#xff08;二&#xff09;&#xff1a;體信息 4&#xff1a;Dubbo3中常見的協議 5&#xff1a;…

華為在ospf area 0單區域的情況下結合pbr對數據包的來回路徑進行控制

配置思路&#xff1a; 兩邊去的包在R1上用mqc進行下一跳重定向 兩邊回程包在R4上用mqc進行下一跳重定向 最終讓內網 192.168.10.0出去的數據包來回全走上面R-1-2-4 192.168.20.0出去的數據包來回全走 下面R1-3-4 R2和R3就是簡單ospf配置和宣告&#xff0c;其它沒有配置&#…

搭建grafana+loki+promtail日志收集系統

準備工作 下載地址 https://github.com/grafana/loki/releases 安裝包放在服務器目錄&#xff1a;/opt wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-lin…