一,最小生成树构造(prime算法)
dis[]数组:当前的树到其他各个顶点的边的最小值,dis[5]表示在当前构造的树当中,距离顶点5的距离最小值;
visit[];表示哪些点已经加入到树中
mp[][];邻接矩阵存图
path[];path[5]表示最终的最小生成树中到5这个点的前驱;相当于记录了最小生成树的边
- 随意选择一个顶点,构成一棵树,并初始化dis数组为该顶点到其他顶点的距离,到自己的距离为0
- 从dis中选择最小的且没有加入到树的顶点记为v,将该顶点加入到树中visit[v]=true,然后更新dis数组从第一个顶点开始到最后一个顶点结束,更新规则,如果dis[j]中的值大于v顶点到j的值,且j没有加入到树中,dis[j]就更新为dis[j]=mp[v][j];
- 重复2 n-1次(因为初始化已经选了一个顶点,每一次2步骤就会选出一个点加入到树中,并且更新dis数组,直到最后构成了一个最小生成树,dis存放的就是最小生成树各边的权值)
int mp[2005][2005];//邻接矩阵存图
bool vis[2005];
int path[2005];//由那条边
int dis[2005];
int prime(){
int minn, u = 1, sum = 0;
//初始化
memset(vis, false, sizeof(vis));
for(int i = 1; i <= n; i++){
dis[i] = mp[1][i];
}
vis[1] = true;
for(int i = 2; i <= n; i++){
minn = inf;
for(int j = 1; j <= n; j++){
if(!vis[j] && minn > dis[j]){
u = j;
minn = dis[j];
}
}
vis[u] = true;
for(int j = 1; j <= n; j++){
if(!vis[j] && dis[j] > mp[u][j]){
dis[j] = mp[u][j];
path[j] = u;
}
}
}
for(int i = 2; i <= n; i++){
sum += dis[i];
}
return sum;
}