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