leetcode 链接:节点间通路
题目
给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
示例:
输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
输出:true
输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4
输出 true
解答 & 代码
- 先用哈希表存储 pair<节点编号, 该节点的邻居们的编号数组>,方便之后的搜索(否则之后搜索每个节点的子节点都要遍历一遍二维数组 graph)
借助队列实现广度优先搜索
- 如果遍历到 target 节点,说明 start 和 target 之间存在通路
如果遍历结束(即队列为空),说明 start 和 target 之间不存在通路
class Solution { public: bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) { // 先将 <节点编号, 该节点的邻居们的编号数组> 存储到哈希表 unordered_map<int, vector<int>> nodeMap; for(int i = 0; i < graph.size(); ++i) { if(nodeMap.find(graph[i][0]) == nodeMap.end()) { vector<int> children(1, graph[i][1]); nodeMap.insert(make_pair(graph[i][0], children)); } else { nodeMap[graph[i][0]].push_back(graph[i][1]); } } // 借助队列实现广度优先搜索 queue<int> nodeQ; nodeQ.push(start); while(!nodeQ.empty()) { int cur = nodeQ.front(); nodeQ.pop(); if(nodeMap.find(cur) != nodeMap.end()) { for(int i = 0; i < nodeMap[cur].size(); ++i) { if(nodeMap[cur][i] == target) return true; nodeQ.push(nodeMap[cur][i]); } } } return false; } };
执行结果: ``` 执行结果:通过
执行用时:324 ms, 在所有 C++ 提交中击败了 37.44% 的用户 内存消耗:75 MB, 在所有 C++ 提交中击败了 43.03% 的用户 ```