描述:克鲁斯卡尔算法是用来求加权连通图的最小生成树的算法 。
在图中,有n个顶点,按照边权由小到大的顺序,将顶点逐渐合并,直到合并到一个顶点为止,此时一共有n-1条边,和prim算法求得结果相同。
样例:
如图所示,用克鲁斯卡尔算法
1、因为图中边权最小的是1->2,边权是2,先将1,2连在一起。如图所示
2、继续在与顶点1,2相连的顶点中,最小边权是3,分别为2->3,2->4,2->5,2->6,按照枚举顺序,所以将顶点3合并。如图所示
3、继续在与顶点1,2,3相连的顶点中,最小边权是3,分别为,2->4,2->5,2->6,按照枚举顺序,所以将顶点4合并。如图所示
4、继续在与顶点1,2,3,4相连的顶点中,最小边权是3,分别为,2->5,2->6,按照枚举顺序,所以将顶点5合并。如图所示
5、继续在与顶点1,2,3,4,5相连的顶点中,最小边权是3,为2->6,所以将顶点6合并。如图所示
将没用边去除后,如图
注意:合并时,可以用“并查集”合并
代码:
vector<int> keruskal(){
sort(edges+1,edges+1+m);
int cnt=0;
for(int i=1;i<=m;i++){
int t1=find(edges[i].n1);
int t2=find(edges[i]