有向图G采用邻接表存储,判断给定两个顶点a、b之间是否存在一条从a到b的路径。使用c++实现代码
时间: 2024-03-24 10:40:26 浏览: 58
采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k得简单路径的算法
4星 · 用户满意度95%
可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来判断两个顶点之间是否存在路径。以下是使用DFS的C++代码示例:
```c++
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 有向图采用邻接表存储
class Graph {
public:
Graph(int n) {
adjList.resize(n);
}
// 添加边
void addEdge(int u, int v) {
adjList[u].push_back(v);
}
// 判断是否存在从s到t的路径
bool hasPath(int s, int t) {
vector<bool> visited(adjList.size(), false); // 记录节点是否被访问过
stack<int> st;
st.push(s);
visited[s] = true;
while (!st.empty()) {
int u = st.top();
st.pop();
for (int v : adjList[u]) {
if (v == t) {
return true; // 找到从s到t的路径
}
if (!visited[v]) {
st.push(v);
visited[v] = true;
}
}
}
return false; // 没有找到从s到t的路径
}
private:
vector<vector<int>> adjList;
};
int main() {
Graph g(5);
g.addEdge(0, 1);
g.addEdge(1, 2);
g.addEdge(2, 3);
g.addEdge(3, 4);
cout << g.hasPath(0, 4) << endl; // 输出1,即存在从0到4的路径
cout << g.hasPath(4, 0) << endl; // 输出0,即不存在从4到0的路径
return 0;
}
```
在上述代码中,我们使用了深度优先搜索(DFS)来遍历图中的节点,并且使用一个栈来保存待访问的节点。在遍历过程中,我们记录每个节点是否被访问过,避免重复访问。如果找到了从s到t的路径,我们就返回true。如果遍历完所有的节点都没有找到从s到t的路径,我们就返回false。
阅读全文