LeetCode 1466. 重新规划路线(DFS/BFS)
文章目錄
- 1. 題目
- 2. 解題
- 2.1 DFS
- 2.2 BFS
1. 題目
n 座城市,從 0 到 n-1 編號,其間共有 n-1 條路線。因此,要想在兩座不同城市之間旅行只有唯一一條路線可供選擇(路線網(wǎng)形成一顆樹)。
去年,交通運輸部決定重新規(guī)劃路線,以改變交通擁堵的狀況。
路線用 connections 表示,其中 connections[i] = [a, b] 表示從城市 a 到 b 的一條有向路線。
今年,城市 0 將會舉辦一場大型比賽,很多游客都想前往城市 0 。
請你幫助重新規(guī)劃路線方向,使每個城市都可以訪問城市 0 。返回需要變更方向的最小路線數(shù)。
題目數(shù)據(jù) 保證 每個城市在重新規(guī)劃路線方向后都能到達(dá)城市 0 。
示例 1:
示例 2:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reorder-routes-to-make-all-paths-lead-to-the-city-zero
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
建立無向圖,在無向圖上dfs 或者 bfs,從0開始
無向圖上記錄上是正向還是反向,遍歷的時候,遇到反向的需要計數(shù)+1
2.1 DFS
class Solution {int count = 0;unordered_map<int,unordered_map<int, bool>> m; public:int minReorder(int n, vector<vector<int>>& connections) {vector<bool> vis(n,false);for(auto& c : connections){m[c[0]][c[1]] = true;//等于true的需要反轉(zhuǎn)m[c[1]][c[0]] = false;}vis[0] = true;dfs(0, vis);return count;}void dfs(int i, vector<bool> &vis){for(auto it = m[i].begin(); it != m[i].end(); ++it){if(!vis[it->first]){if(m[i][it->first])//是反向的count++;vis[it->first] = true;dfs(it->first, vis);}}} };960 ms 114.2 MB
2.2 BFS
class Solution { public:int minReorder(int n, vector<vector<int>>& connections) {int count = 0, id;unordered_map<int,unordered_map<int, bool>> m;vector<bool> vis(n,false);for(auto& c : connections){m[c[0]][c[1]] = true;//等于true的需要反轉(zhuǎn)m[c[1]][c[0]] = false;}vis[0] = true;queue<int> q;q.push(0);while(!q.empty()){id = q.front();q.pop();for(auto it = m[id].begin(); it != m[id].end(); ++it){if(!vis[it->first]){if(m[id][it->first])count++;vis[it->first] = true;q.push(it->first);}}}return count;} };984 ms 115.2 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1466. 重新规划路线(DFS/BFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 845. 数组中的最长
- 下一篇: LeetCode 491. 递增子序列(