易错点:判断重边
易错点:多组数据输入,每次都要对邻接矩阵初始化
重点:以起点为出发点
最短路:从一点走到另一点即可
最小生成树:遍历每一个点
til the cow come home
poj 2387
Dijkstra算法
基本思想
整个算法都是以起点作为出发点,研究从起点到某点的最短距离,最终dist存放从起点到未纳入路径的点的最短距离。
各变量说明
int map[M][M]:邻接矩阵,存放每两点之间的路程,初始化时均设为INF,根据题设输入路程。需要注意:
- 1-2的距离即放在[1][2],有放在[2][1]需要一并输入
- 可能会有多次输入一条边的情况,两点之间有两条路,所以输入的时候要首先判断一下新的输入是不是比旧的短
memset(map, 0x0f, sizeof(map));
memset 包含在cstring库中
bool flag[M]:某个点是否已经纳入路径中,是不是已经找过某个点,初始化为false
int dist[M]:目前从起点到其余各点的最短距离,这个dist在整个程序中有效,最终结果由dist输出。初始化为INF,即没有路
其实dist真正有用的部分在于记录到未纳入路径的点的距离,所以只需要关注/更新未纳入路径点的dist
dist的意义与最小生成树不同
步骤
- 把起点纳入路径,dist[M]初始化为从起点到其余各点的路径
- 循环n-1次,每一次都纳入一个新的点,循环完以后所有的点都纳入路径
2.1 在还未纳入路径的点中找到dist[i]最短的点将它纳入路径
2.2 更新这个新的点对dist的影响
即加入新的点后最短距离将变为 min ( 原先起点到该点的最短距离,起点->新的点->该终点)
if(flag[i]==false) //只关心还未纳入路径的点的dist
dist[i]=min(dist[i], dist[newnode]+map[newnode][i];
程序见document\language C\prepare\shortest path
网友评论