假设有向图G以邻接矩阵方式存储,试编写算法判断该有向图中是否存在从顶点i到顶点j的路径(i~=j)。[可调用已有算法]
时间: 2024-12-16 21:16:43 浏览: 14
为了判断有向图 G 是否存在从顶点 i 到顶点 j 的路径,我们可以利用深度优先搜索(DFS)或者广度优先搜索(BFS)。这里我会给出两种算法的思路:
**1. 深度优先搜索(DFS)**
首先,我们需要一个布尔型数组 visited 存储每个节点是否被访问过。以下是使用 DFS 的 C++ 代码实现:
```cpp
bool hasPathDFS(int graph[5][5], int i, int j, bool visited[]) {
visited[i] = true;
if (i == j) {
return true; // 直接返回,找到了目标节点
}
for (int k = 0; k < 5; ++k) { // 假设邻接矩阵的大小是 5x5
if (graph[i][k] != 0 && !visited[k]) {
if (hasPathDFS(graph, k, j, visited)) {
return true; // 通过递归找到路径,返回 true
}
}
}
return false; // 若遍历完都没有找到路径,返回 false
}
```
你可以调用此函数并传入邻接矩阵、起始顶点 i 和目标顶点 j,以及 visited 数组。
**2. 广度优先搜索(BFS)**
另一种方法是使用 BFS,因为 BFS 可以保证先找到最近的路径。首先创建一个队列,并将起点加入队列。然后,逐层扩展节点直到找到目标或队列为空:
```cpp
bool hasPathBFS(int graph[5][5], int i, int j) {
queue<int> q;
vector<bool> visited(5, false); // 使用 vector 更方便
q.push(i);
visited[i] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == j) {
return true; // 找到了目标节点
}
for (int k = 0; k < 5; ++k) {
if (graph[cur][k] != 0 && !visited[k]) {
q.push(k);
visited[k] = true;
}
}
}
return false; // 未找到路径
}
```
同样,调用 `hasPathBFS(graph, i, j)` 即可。
阅读全文