本文已参与「新人创作礼」活动,一起开启掘金创作之路。
简介
该算法利用贪心的思想选择当前权值最小的一条边,作为最小生成树的一部分,并利用并查集来判断当前的选择是否会导致“环”的出现。
代码流程
首先需要用结构体储存一条边的两个端点的编号及其权值,同时我们需要用优先队列按边的权值大小排序储存每一条边。
struct node{
int x,y;//边的两个端点的编号
int t;//边的权值
friend bool operator < (node a, node b)
{
return a.t > b.t;
}//按照边的权值排序
};
priority_queue<node>q;
然后,需要开始生成最小生成树。 我们需要找到当前权值最小的一条边,作为最小生成树的一部分,但如果当前的边加入后会形成环的话,就要舍弃这条边,判断是否有环就交给并查集好了。只需要加入n-1条边,最小生成树就完成了。
int ans = 0;//表示最小生成树中所有边的权值
int cnt = 0;//记录加了的边的条数
while(cnt < n-1)
{
if(!q.empty())
now = q.top();//始终选择最顶上的边
else
break;
if(find(now.x) != find(now.y))//判断选择的边是否构成环
{
f[find(now.x)] = find(now.y);//将端点纳入同一个集合,表示他们之间可以互通
ans += now.t;
cnt++;//选择的边的数量++;
}
q.pop();
}