Prim算法
思路
1.初始各个顶点到集合S的距离,只有初始顶点到集合S的距离为0,用 vis[] 来表示集合S;
2.遍历顶点,每次将 未加入集合S(!vis[i]) 但 距离集合S最近(最小d[]) 的一个顶点u加入集合S,并且更新 与u相连 的 未加入集合S 的顶点v到集合S的距离(d[]);
3. 遍历结束后,返回边权之和,若中途判断图不连通就返回-1。
代码
const int MAXV = 1000;//最大顶点数
const int INF = 0x3f3f3f3f;//一个很大的数
int n,m,G[MAXV][MAXV];//顶点数,边数,图的二维数组储存边权
int d[MAXV] ;//各个顶点到集合S的距离
int vis[MAXV] = {
false};//一开始都不属于集合S
int prim(){
fill(d,d+MAXV,INF);//初始化各个顶点到集合S的距离
d[0] = 0;//只有初始顶点到集合S的距离为0,可以换别的顶点
int ans = 0;//边权之和
for(int i=0;i<n;i++){