0
点赞
收藏
分享

微信扫一扫

1971. 寻找图中是否存在路径————附带详细代码

0 结果

请添加图片描述

1 题目

在这里插入图片描述

2 思路

使用DFS算法(深度遍历算法),仅加入源点,然后使用DFS从该点遍历,如果途中遍历到目的点,那就说明源点到目的点存在路径。

3 代码

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

class Solution {
public:
bool validPath(int n, vector<vector<int>>& edges, int source, int destination) {
bool vis[n];
std::fill(vis, vis + n, 0);
//邻接矩阵
// int G[n + 1][n + 1];//测试值有5000
// std::memset(G, 0, sizeof(G));
// for(int i = 0;i < edges.size();i++){
// int u = edges[i][0];
// int v = edges[i][1];
// G[u][v] = 1;
// G[v][u] = 1;
// }
//邻接表
vector<int> G[n];
for (int i = 0;i < edges.size();i++){
int u = edges[i][0];
int v = edges[i][1];
G[u].push_back(v);
G[v].push_back(u);
}

bool isFind = false;
auto DFS = [&vis, &G, &isFind, destination, n](int u, int depth)->void {
auto f = [&](auto&& self, int u, int depth)->void {
if(u == destination){
isFind = true;
return ;
}
vis[u] = true;
// for(int v = 0;v < n;v++){//邻接矩阵
// if(vis[v] == false && G[u][v] != 0){
// self(self, v, depth + 1);
// }
// }
for(int i = 0;i < G[u].size();i++){//邻接表
int v = G[u][i];
if(vis[v] == false){
self(self, v, depth + 1);
}
}

};
return f(f, u, depth);
};

DFS(source, 0);

return isFind;
}
};

测试代码:

    vector<vector<int>> edges{{0,7}, {0,8}, {6,1}, {2,0}, {0,4}, {5,8}, {4,7}, {1,3}, {3,5}, {6,5}};
// vector<vector<int>> edges{{0,1}, {1,2}, {2,0}};
// vector<vector<int>> edges{{0,1}, {0,2}, {3,5}, {5, 4}, {4,3}};
Solution s;
cout<<s.validPath(10, edges, 7, 5);
举报

相关推荐

0 条评论