普里姆算法求最小生成树与之前发的迪杰斯特拉算法求最小生成树的思想类似,都是用到一个dis数组,不过与迪杰斯特拉算法不同的是,之前迪杰斯特拉算法求最短路里dis存储的是源点到各点的最短路,每次循环找离源点最近的点,确认后加入到已知最短路的集合中,并标记。然后根据这个最近的点松弛离源点最近的点的距离,而这里对dis进行松弛的时候,只需要判断
与找到的最近点相连的点的距离<初始源点到这个点的直接距离然后松弛就行,其余的跟迪杰斯特拉算法几乎一样。我们会注意到这里为什么不用像迪杰斯特拉算法一样加上之前的距离进行判断呢,因为迪杰斯特拉算法求的是离源点的最短路,而普里姆算法求的是与已构造的最小生成树之间的最短路,不管是不是源点,因此只需要根据离它最近的点进行松弛就行,不用加上之前的距离。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
int N,M;
int dis[100],G[100][100],book[100];//dis表示该点到已构建生成树的距离 book为标志已加入生成树
void pilm()