分别基于深度优先搜索和广度优先搜索编写算法并给出c++代码,判断以邻接表存储的有向图中是否存在由顶点vi 到顶点vj的路径(i≠j)。
时间: 2024-03-14 11:48:01 浏览: 68
好的,以下是基于深度优先搜索和广度优先搜索的 C++ 代码:
```
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
// 定义图节点结构体
struct GraphNode {
int val;
vector<GraphNode*> neighbors;
GraphNode(int x) : val(x) {}
};
// 深度优先搜索算法
bool DFS(GraphNode* start, GraphNode* end, vector<bool>& visited) {
if (start == end) {
return true;
}
visited[start->val] = true;
for (int i = 0; i < start->neighbors.size(); ++i) {
if (!visited[start->neighbors[i]->val]) {
if (DFS(start->neighbors[i], end, visited)) {
return true;
}
}
}
return false;
}
// 广度优先搜索算法
bool BFS(GraphNode* start, GraphNode* end, vector<bool>& visited) {
queue<GraphNode*> q;
q.push(start);
visited[start->val] = true;
while (!q.empty()) {
GraphNode* node = q.front();
q.pop();
if (node == end) {
return true;
}
for (int i = 0; i < node->neighbors.size(); ++i) {
if (!visited[node->neighbors[i]->val]) {
q.push(node->neighbors[i]);
visited[node->neighbors[i]->val] = true;
}
}
}
return false;
}
// 判断图中是否存在由顶点vi到顶点vj的路径
bool hasPath(GraphNode* start, GraphNode* end) {
vector<bool> visited(100, false); // 假设图中最多有100个节点
// return DFS(start, end, visited);
return BFS(start, end, visited);
}
int main() {
// 构建有向图
GraphNode* node0 = new GraphNode(0);
GraphNode* node1 = new GraphNode(1);
GraphNode* node2 = new GraphNode(2);
GraphNode* node3 = new GraphNode(3);
GraphNode* node4 = new GraphNode(4);
node0->neighbors.push_back(node1);
node0->neighbors.push_back(node2);
node1->neighbors.push_back(node2);
node2->neighbors.push_back(node0);
node2->neighbors.push_back(node3);
node3->neighbors.push_back(node3);
// 测试
cout << hasPath(node1, node4) << endl; // 0
cout << hasPath(node2, node3) << endl; // 1
return 0;
}
```
在代码中,我们首先定义了一个图节点结构体 `GraphNode`,包含一个 `val` 成员表示节点值和一个 `neighbors` 数组表示节点的邻居节点。然后,我们分别实现了深度优先搜索算法和广度优先搜索算法,其中参数 `start` 表示搜索的起始节点,参数 `end` 表示搜索的目标节点,参数 `visited` 表示该节点是否被访问过。
最后,我们在 `main` 函数中构建了一个有向图,并测试了两个节点之间是否存在路径。需要注意的是,在测试前需要先将 `visited` 数组初始化为 `false`。
阅读全文