实现Dijkstra算法,解决无向连通有权图的单源最短路径问题,源点为0点,在控制台窗口输出每个点到0点的最短距离和对应的路径。用C++解决
时间: 2024-03-23 13:38:16 浏览: 53
Dijkstra最短路径算法的C++实现
好的,下面是C++实现Dijkstra算法的代码,注释经解释了每一步的含义。请注意,本代码中的图采用邻接矩阵来表示,可以根据需要进行修改。
```cpp
#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 100;
const int INF = 0x3f3f3f3f; //INF表示正无穷
bool vis[MAX]; //标记数组,标记节点是否被访问
int dis[MAX]; //记录每个节点到源点的最短距离
int pre[MAX]; //记录每个节点的前驱节点
int graph[MAX][MAX]; //邻接矩阵表示图
int n; //节点个数
void dijkstra(int start)
{
memset(vis, false, sizeof(vis));
memset(dis, INF, sizeof(dis));
memset(pre, -1, sizeof(pre));
dis[start] = 0; //源点到自己的距离为0
//n个节点循环n次,每次找到一个距离最小的节点
for (int i = 0; i < n; i++)
{
int min_dis = INF, min_index;
for (int j = 0; j < n; j++)
{
if (!vis[j] && dis[j] < min_dis)
{
min_dis = dis[j];
min_index = j;
}
}
vis[min_index] = true; //标记该节点已访问
//更新当前节点的所有邻居节点的最短距离
for (int k = 0; k < n; k++)
{
if (!vis[k] && graph[min_index][k] != INF && dis[min_index] + graph[min_index][k] < dis[k])
{
dis[k] = dis[min_index] + graph[min_index][k];
pre[k] = min_index;
}
}
}
}
void print_path(int start, int end)
{
if (start == end)
{
cout << start << " ";
return;
}
print_path(start, pre[end]);
cout << end << " ";
}
int main()
{
//读入节点个数和邻接矩阵
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> graph[i][j];
if (graph[i][j] == -1) //表示节点i和节点j之间没有直接连边
graph[i][j] = INF;
}
}
dijkstra(0); //从源点0开始求最短路径
//输出每个节点到0点的最短距离和路径
for (int i = 0; i < n; i++)
{
cout << "节点" << i << "到0点的最短距离为:" << dis[i] << endl;
cout << "路径为:";
print_path(0, i);
cout << endl;
}
return 0;
}
```
需要注意的是,本代码中的邻接矩阵表示图中的-1表示两个节点之间没有直接连边,可以根据实际情况修改。另外,在求最短路径之前,需要先将邻接矩阵中的-1转化为INF,以便于后续计算。
阅读全文