试分别基于图的深度优先搜索策略,和广度优先策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i不等于j),注意,算法中涉及的图的基本操作必须在此数据结构上实现,分别给出完整c语言伪代码
时间: 2024-02-13 07:07:20 浏览: 108
图的邻接表存储 实现图的深度和广度优先搜索
5星 · 资源好评率100%
以下是基于图的深度优先搜索策略的伪代码:
```
// 判断从顶点vi到顶点vj是否存在路径
bool dfs(Graph* graph, int vi, int vj, bool visited[]) {
visited[vi] = true; // 标记当前节点已访问
if (vi == vj) return true; // 如果到达目标节点,则返回true
AdjNode* curr = graph->adjList[vi].head; // 获取当前节点的邻居节点
while (curr != NULL) {
if (!visited[curr->dest]) { // 如果邻居节点未访问
if (dfs(graph, curr->dest, vj, visited)) // 递归查找目标节点
return true; // 如果找到路径,则返回true
}
curr = curr->next; // 继续访问下一个邻居节点
}
return false; // 没有找到路径,返回false
}
// 判断从顶点vi到顶点vj是否存在路径
bool hasPath(Graph* graph, int vi, int vj) {
bool visited[graph->V]; // 定义节点访问标记数组
for (int i = 0; i < graph->V; i++)
visited[i] = false; // 初始化所有节点为未访问状态
return dfs(graph, vi, vj, visited); // 开始深度优先搜索
}
```
以下是基于图的广度优先搜索策略的伪代码:
```
// 判断从顶点vi到顶点vj是否存在路径
bool bfs(Graph* graph, int vi, int vj) {
bool visited[graph->V]; // 定义节点访问标记数组
for (int i = 0; i < graph->V; i++)
visited[i] = false; // 初始化所有节点为未访问状态
queue<int> q; // 定义队列,存储待访问节点
visited[vi] = true; // 标记当前节点已访问
q.push(vi); // 将当前节点加入队列
while (!q.empty()) {
int curr = q.front(); // 获取队列首节点
q.pop(); // 弹出队列首节点
if (curr == vj) return true; // 如果到达目标节点,则返回true
AdjNode* node = graph->adjList[curr].head; // 获取当前节点的邻居节点
while (node != NULL) {
if (!visited[node->dest]) { // 如果邻居节点未访问
visited[node->dest] = true; // 标记邻居节点已访问
q.push(node->dest); // 将邻居节点加入队列
}
node = node->next; // 继续访问下一个邻居节点
}
}
return false; // 没有找到路径,返回false
}
// 判断从顶点vi到顶点vj是否存在路径
bool hasPath(Graph* graph, int vi, int vj) {
return bfs(graph, vi, vj); // 开始广度优先搜索
}
```
阅读全文