prim算法中的最小生成树是,采用的是从一个顶点开始,让一棵小树逐渐长成最小生成树,而kruskal算法,采用的是每次选择权值最小的一条边作为生成树,采用将每一棵生成树合并一棵最小生成树方法。也就是将树合成为森林。有一点需要注意:就是将新边加入到最小生成树中时,要判断是否构成回路,如果构成回路的话,则不能加入。那么问题来了,如何判断构成回路呢?一种是采用深度优先搜索来判断两个顶点是否连通,另一种是采用并查集来判断是否连通,将所有的顶点加入到一个并查集中,判断两个顶点是否连通,只需要判断两个顶点是否在同一个集合中(即是否有共同的祖先)。
代码如下:
/************************************************************************
*
* 文件名:8.1.2.cpp
*
* 文件描述:最小生成树之克鲁斯卡尔算法(Kruskal)
*
* 创建人: fdk
* 时 间: 2018-09-13
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include&l