/*
0 1 10
0 3 30
0 4 100
3 4 60
3 2 20
1 2 50
2 4 10
*/
//Geeksun 2018.06.20
#include <iostream>
#include <String>
using namespace std;
const int maxSize = 10;
const int maxNum = 99999;
class MyGraph
{
public:
MyGraph(char str[], int vertexNum, int arcNum);
~MyGraph() {};
friend void Dijstra(MyGraph G, int v);
private:
int arc[maxSize][maxSize];
string vertex[maxSize];
int vertexNum, arcNum;
};
MyGraph::MyGraph(char str[], int vertexNum, int arcNum)
{
this->arcNum = arcNum;
this->vertexNum = vertexNum;
for (int i = 0;i < vertexNum;i++)
{
vertex[i] = str[i];
}
for (int i = 0;i < maxSize;i++)
{
for (int j = 0;j < maxSize;j++)
{
if (i == j)
{
arc[i][j] = 0;
}
else
{
arc[i][j] = maxNum;
}
}
}
for (int k = 0;k < arcNum;k++)
{
int i, j, weight;
cin >> i >> j >> weight;
arc[i][j] = weight;
}
}
void Dijstra(MyGraph G, int v)
{
int num = 1;
string path[maxSize];
int S[maxSize];
int dist[maxSize];
for (int i = 0;i < G.vertexNum;i++)
{
dist[i] = G.arc[v][i];
if (dist[i] != maxNum)
{
path[i] = G.vertex[v] + "->" + G.vertex[i];
cout << path[i] << "----" << dist[i] << endl;
}
else
{
path[i] = "";
}
}
S[0] = v;
dist[v] = maxNum;
int i, k;
while (num < G.vertexNum)
{
for (i = 0, k = 0;i < G.vertexNum;i++)
{
if (dist[i] < dist[k] && dist[i] != 0)
{
k = i;
}
}
S[num++] = k;
for (int i = 0;i < G.vertexNum;i++)
{
if (dist[i] > dist[k] + G.arc[k][i])
{
dist[i] = dist[k] + G.arc[k][i];
path[i] = path[k] + "->" + G.vertex[i];
cout << path[i] << "----" << dist[i] << endl;
}
}
dist[k] = 0;
}
}
int main()
{
char vertex[6] = "01234";
MyGraph myGraph(vertex, 5, 7);
Dijstra(myGraph, 0);
return 0;
}
最短路径——Dijkstra算法
最新推荐文章于 2024-08-17 15:22:06 发布
本文介绍了一个使用C++实现的Dijkstra最短路径算法。通过定义一个图类`MyGraph`来存储顶点和边,并利用Dijkstra算法计算从指定起点到其他所有顶点的最短路径。代码中详细展示了如何初始化图、读取边权重以及如何应用Dijkstra算法进行路径计算。
1万+

被折叠的 条评论
为什么被折叠?



