根据您提供的代码,我稍作修改实现了利用Dijkstra算法求指定源点到其余各顶点的最短路径,并输出最短路径及其长度。以下是修改后的代码:
#include <iostream>
#include "ALDirNetwork.h"
#include "SqStack.h"
void Dijkstra(ALDirNetwork<char, int>& graph, int v0, int* dist, int* path)
{
const int infinity = graph.GetInfinity();
int vertexCount = graph.GetVexNum();
for (int v = 0; v < vertexCount; ++v) {
dist[v] = graph.GetWeight(v0, v);
if (dist[v] == infinity) {
path[v] = -1;
} else {
path[v] = v0;
}
}
graph.SetVisitedTag(v0, VISITED);
for (int i = 1; i < vertexCount; ++i) {
int u = v0;
int minDist = infinity;
// Find the unvisited vertex with minimum distance
for (int v = 0; v < vertexCount; ++v) {
if (graph.GetVisitedTag(v) == UNVISITED && dist[v] < minDist) {
u = v;
minDist = dist[v];
}
}
graph.SetVisitedTag(u, VISITED);
// Update distances and paths for adjacent vertices
for (int v = graph.GetFirstAdjvex(u); v != -1; v = graph.GetNextAdjvex(u, v)) {
if (graph.GetVisitedTag(v) == UNVISITED && minDist + graph.GetWeight(u, v) < dist[v]) {
dist[v] = minDist + graph.GetWeight(u, v);
path[v] = u;
}
}
}
}
void OutputShortestPath(ALDirNetwork<char, int>& graph, int v0, int* dist, int* path)
{
char vertex;
graph.GetElem(v0, vertex);
int vertexCount = graph.GetVexNum();
for (int i = 0; i < vertexCount; ++i) {
if (i != v0) {
char destVertex;
graph.GetElem(i, destVertex);
if (dist[i] == graph.GetInfinity()) {
std::cout << "There is no path between " << vertex << " and " << destVertex << "\n";
continue;
}
std::cout << "The shortest path between " << vertex << " and " << destVertex << " is: ";
// Output the vertices on the shortest path
SqStack<int> stack;
int index = i;
while (path[index] != -1) {
stack.Push(index);
index = path[index];
}
std::cout << vertex;
while (!stack.IsEmpty()) {
char tmp;
int k;
stack.Pop(k);
graph.GetElem(k, tmp);
std::cout << " -> " << tmp;
}
std::cout << "\nThe distance is: " << dist[i] << "\n";
}
}
}
int main()
{
ALDirNetwork<char, int> graph(6); // 创建一个有6个顶点的邻接表表示的有向图
// 添加边和权值
graph.AddEdge(0, 1, 2);
graph.AddEdge(0, 2, 4);
graph.AddEdge(1, 2, 1);
graph.AddEdge(1, 3, 4);
graph.AddEdge(2, 3, 1);
graph.AddEdge(2, 4, 3);
graph.AddEdge(3, 4, 5);
graph.AddEdge(3, 5, 6);
graph.AddEdge(4, 5, 2);
int* dist = new int[graph.GetVexNum()];
int* path = new int[graph.GetVexNum()];
// 指定源点为顶点0
Dijkstra(graph, 0, dist, path);
// 输出最短路径及其长度
OutputShortestPath(graph, 0, dist, path);
delete[] dist;
delete[] path;
return 0;
}
请根据需要将该代码添加到您的程序中,并根据实际情况进行适当修改。
内容由零声教学AI助手提供,问题来源于学员提问