以下是基于邻接表表示的有向图的广度优先搜索算法,用于判断是否存在从顶点vi到顶点vj的路径。
template<class DataType, class WeightType>
bool ALDirNetwork<DataType, WeightType>::ExistsPath(int vi, int vj) const {
if (vi == vj) { // 如果起始顶点和目标顶点相同,则认为存在路径
return true;
}
std::queue<int> q; // 使用队列保存待访问的顶点
visited[vi] = VISITED; // 标记起始顶点为已访问
q.push(vi); // 将起始顶点加入队列
while (!q.empty()) {
int currentVertex = q.front(); // 获取当前处理的顶点
q.pop(); // 弹出队首元素
// 遍历当前顶点的邻接点
for (int adjVertex = GetFirstAdjvex(currentVertex); adjVertex >= 0;
adjVertex = GetNextAdjvex(currentVertex, adjVertex)) {
if (adjVertex == vj) { // 如果找到了目标顶点,则说明存在路径
return true;
}
if (visited[adjVertex] == UNVISITED) { // 如果邻接顶点未被访问过,则标记为已访问,并加入队列中等待处理
visited[adjVertex] = VISITED;
q.push(adjVertex);
}
}
}
return false; // 遍历完所有可达节点后仍然没有找到目标顶点,说明不存在路径
}
使用示例:
ALDirNetwork<int, int> graph;
// 初始化有向图
int startVertex = 0;
int targetVertex = 5;
bool existsPath = graph.ExistsPath(startVertex, targetVertex);
if (existsPath) {
std::cout << "存在从顶点" << startVertex << "到顶点" << targetVertex << "的路径" << std::endl;
} else {
std::cout << "不存在从顶点" << startVertex << "到顶点" << targetVertex << "的路径" << std::endl;
}
请注意,以上代码仅为算法实现示例,并非完整的可运行代码。你需要根据具体情况进行适当调整和完善。
内容由零声教学AI助手提供,问题来源于学员提问