Prime算法构造最小生成树
1.问题
给定一张边带权的无向图G = (V,E) , n =|V| , m = |E| 。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最小生成树。
2.解析
3.设计
void prime(){
memset(d,0x3f,sizeof(d));//初始化d数组,默认为无穷大
memset(v,0,sizeof(v));//初始化v数组为0,即所有点未被连通
d[1]=0;//特定从点1开始形成最小生成树
for(i form 1 to n-1){
x=0;
for(j form 1 to n){
if(!v[j]&&(x==0||d[j]<d[x])){
x=j;
}
//点未被连通且找到最小权值边,记为x
}
v[x]=1;//标记点已经走过
for(y form 1 to n){
if(!v[y])d[y]=min(d[y],a[x][y]);
//如果该点未连通,则更新d数组
}
}
for(i form 2 to n){
//权值相加
ans+=d[i];
}
}
4.分析
时间复杂度分析:设n个顶点,m条边。
- 对集合中的每一个顶点的d数组和v数组进行初始化操作:O(n)
- 加点、寻找最小权值边,同时更新d数组:O(n^2)
- 各点权值相加:O(n)
综上所诉,Prime算法的时间复杂度为O(n^2)。