KRUSKAL算法构造最小生成树
1.问题描述
假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。
2.kruskal算法的计算过程
新建图G,G中拥有原图中相同的节点,但没有边;
将原图中所有的边按权值从小到大排序;
从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中;
重复3,直至图G中所有的节点都在同一个连通分量中。
3.图像表示
4. 代码实现
struct graph
{
int u,v,cost;
void set(int a,int b,int w){u=a,v=b,cost=w;}
} ;
graph d[N*(N+1)/2];
int father[N];
int Find(int x)
{
if (father[x]==-1) return x;
return father[x] = Find(father[x]);
}
bool Union(int x, int y)
{
x = Find(x);
y = Find(y);
if (x==y) return false;
if (x>y) father[x] = y;
if (x<y) father[y] = x;
return true;
}
int cmp(graph x,graph y)
{
if (x.cost<y.cost) return true;
return false;
}
5. 源码地址
https://github.com/adamlallana77/-/blob/master/Kruskal%E7%AE%97%E6%B3%95.cpp