//============================================================================
// Name : Dijkstra.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 6
#define INF 100000
int n;
int map[MAXN][MAXN]; //定义一个 6*6 的图
int dist[MAXN]; //存储最短路径的 长度
int visit[MAXN]; //是否已求得最短路径
int path[MAXN]; //存储路径
//求start 到其他各点j的最短距离(存储在dist[j])
void dijkstra(int start)
{
for (int i = 0; i < MAXN; i++)
{
dist[i] = map[start][i];
visit[i] = 0; //初始化
if (i != start && dist[i] < INF)
path[i] = start; //用path记录路径
else
path[i] = -1;
}
visit[start] = 1;
dist[start] = 0; //存储从开始位置到其他位置的距离
for (int i = 0; i < MAXN - 1; i++)
{
int min = INF;
int u = start;
//选择当前集合T中具有最短路径的顶点u
for (int j = 0; j < MAXN; j++)
{
if (!visit[j] && dist[j] < min)
{
u = j;
min = dist[j];
}
}
visit[u] = 1; //当顶点u加入到集合S, 表示它的最短路径已经求得
/* 更新dist[] 和 path */
for (int k = 0; k < MAXN; k++)
{
//如果位置k 还为求得 && u可达k
if (!visit[k] && map[u][k] < INF)
{
int temp = dist[u] + map[u][k];
// 如果通过u到达k比原来的距离要短,就更新。
if (temp < dist[k])
{
dist[k] = temp;
path[k] = u;
}
}
}
}
}
int main()
{
// scanf("%d", &n);
int a, b, c;
for (int i = 0; i < 6; i++)
for (int j = 0; j < 6; j++)
map[i][j] = 100000;
//读入数据 a==-1 时结束
while (1)
{
scanf("%d %d %d", &a, &b, &c);
if (a == -1)
break;
map[a][b] = c;
}
int start = 0;
dijkstra(start); //求start 到其他各点j的最短距离(存储在dist[j])
//输出最短距离
for (int i = 0; i < MAXN; i++)
{
if (i != start)
{
printf("%d 到 %d 最短路径:", start, i);
int temp = i;
printf("%d", temp);
while (path[temp] != start)
{
temp = path[temp];
printf(" <- %d", temp);
}
printf(" <- %d ,长度: %d \n", start, dist[i]);
}
}
return 0;
}
/*
0 2 5
0 3 20
1 0 2
1 4 8
2 5 7
2 1 15
4 3 4
5 3 10
5 4 18
-1 -1 -1
*/
测试;
0 2 5
0 3 20
1 0 2
1 4 8
2 5 7
2 1 15
4 3 4
5 3 10
5 4 18
-1 -1 -1
0 到 1 最短路径:1 <- 2 <- 0 ,长度: 20
0 到 2 最短路径:2 <- 0 ,长度: 5
0 到 3 最短路径:3 <- 0 ,长度: 20
0 到 4 最短路径:4 <- 1 <- 2 <- 0 ,长度: 28
0 到 5 最短路径:5 <- 2 <- 0 ,长度: 12