给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
输入: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
思路:
用vector<vector< int > 记录有向图,构造完后,尝试DFS遍历。
需要额外使用一个vector< bool >来记录当前节点是否被访问过,避免重复访问。
class Solution {
public:
bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {
buildPaths(n, graph);
visits = vector<bool>(n);
return dfs(start, target);
}
private:
// 深度遍历
bool dfs(int cur, int target) {
if (cur == target) {
// 到达终点
return 1;
}
for (auto x : paths[cur]) {
if (visits[x]) {
// 节点已被访问过,无需再次访问
continue;
}
visits[x] = 1; // 标记已访问
if (dfs(x, target)) {
// 深度优先查找,找着了终点
return 1;
}
}
// 找不着
return 0;
}
// 构造图
void buildPaths(int n, vector<vector<int>>& graph) {
paths = vector<vector<int>>(n); // 初始化图
for (auto& x : graph) {
int key = x[0], val = x[1];
paths[key].emplace_back(val);
}
}
vector<bool> visits; // 记录是否访问过
vector<vector<int>> paths; // 图,下标代表节点,值代表可达节点
};