1.Keruskal算法可以从边里选出最小的构成树(贪心)
如图:
初始化
顶点 | 1 | 2 | 3 | 4 | 5 | 6 |
所属集合 | 1 | 2 | 3 | 4 | 5 | 6 |
next
顶点 | 1 | 2 | 3 | 4 | 5 | 6 |
所属集合 | 1 | 1 | 1 | 1 | 1 | 6 |
at last
顶点 | 1 | 2 | 3 | 4 | 5 | 6 |
所属集合 | 1 | 1 | 1 | 1 | 1 | 1 |
2.算法描述:① 按边权进行排序
②初始化并查集
③遍历每一条边,判断第i条边的两个顶点是否属于同一集合,如果属于不同集合,则把这条边加入到树中并修改并查集,使集合合并
部分代码实现:
void Keruskal(){
sort(edges+1,edges+m+1);//①
int cnt=0;
for(int i=1;i<=n;i++){//②
p[i]=i;
}
for(int i=1;i<=m;i++){//③
int t1=find(edges[i].n1);
int t2=find(edges[i].n2);
if(t1==t2)continue;
p[t2]=t1;
ans+=edges[i].e;
result.push_back(i);
cnt++;
if(cnt==n-1)break;
}
}