#include<iostream>
using namespace std;
#define N 10000
#define Linit 11
void Dijstra(int edges[][Linit], int origin, int* dist, int* path);
int main()
{
char str[200] = {'1','-','4',',','1','-','6',',','2','-','4',',','2','-','6',',','3','-','5',',','3','-','6',',','4','-','5',',','5','-','6'};
int origin = 1;
int target = 3;
int dist[Linit] = { N }; //从原节点到每个Vi终点的最短路径长度
int path[Linit] = { -1 }; //保存从原节点到节点Vi最短路径上Vi的前一个节点
int edges[Linit][Linit]; //图的邻接矩阵
//int node_num = 0; //图中节点数
int x = 0, y = 0;
for (int i = 0; i < Linit; i++)
{
for (int j = 0; j < Linit; j++)
{
if (i == j)
{
edges[i][j] = 0;
}
else
{
edges[i][j] = N;
}
}
}
/*cout << "原点与目地点:" << endl;
cin >> origin >> target;
cout << "请输入顶点-顶点串:" << endl;
cin >> str;*/
cout << origin << "to" << target << ":" << str << endl;
//edges[][]初始化
for (int i = 0; str[i] != '\0'; i += 4)
{
x = str[i] - '0';
y = str[i + 2] - '0';
edges[x][y] = 1;
edges[y][x] = 1;
//cout << "x=" << x << "y= " << y << endl;
}
Dijstra(edges, origin, dist, path);
cout << target << " ";
for (int i = target; path[i] != origin; i = path[i])
{
cout << path[i] << " ";
}
cout << origin << endl;
return 0;
}
void Dijstra(int edges[][Linit], int origin, int* dist, int* path)
{
int set[N]; //t[i] == 1, 表示节点已纳入最短路径集合
int min, i, j, u;
//初始化
for (int i = 0; i < Linit; i++)
{
//dist[]初始化
dist[i] = edges[origin][i];
set[i] = 0;
//path[]初始化
if (edges[origin][i] < N && i != origin)
{
path[i] = origin;
}
else
{
path[i] = -1;
}
}
set[origin] = 1;
path[origin] = -1;
//关键操作开始
for (i = 1; i < Linit; i++)
{
min = N;
for (j = 1; j < Linit; j++)
{
if (set[j] == 0 && dist[j] < min)
{
u = j;
min = dist[j];
}
}
set[u] = 1; //将选出的顶点并入最短路径中
for (j = 1; j < Linit; j++)
{
if (set[j] == 0 && dist[u] + edges[u][j] < dist[j])
{
dist[j] = dist[u] + edges[u][j];
path[j] = u;
}
}
}
}
输出结果:
参考《数据结构高分笔记》