#include<iostream>
#define INF 0xffffff
#define M 1000
using namespace std;
double dis[M], map[M][M];
bool flag[M];
int prim(int s, int n) //s为起点,n为点的个数
{
int i, j, k, temp, md, total = 0;
for(i = 1; i <= n; i++)
dis[i] = map[s][i]; //与最短路不同,而是将dis置为map[s][i]
memset(flag, false, sizeof(flag));
flag[s] = true; //将起点加入集合
for(i = 1; i < n; i++)
{ //依旧进行n-1次迭代,每次找到不在集合的最小边
md = INF;
for(j = 1; j <= n; j++)
{
if(!flag[j] && dis[j] < md)
{
md = dis[j];
temp = j;
}
}
flag[temp] = true; //将找到的最小边的点加入集合
total += md; //并将这个边的权值加到total中
for(j = 1; j <= n; j++) //松弛操作,注意与最短路不同
if(!flag[j] && dis[j] > map[temp][j])
dis[j] = map[temp][j];
}
return total;
}
prim算法模版
最新推荐文章于 2021-09-18 18:16:12 发布