- kruskal算法是一种生成最小生成树的经典算法,时间复杂度为eloge(e为边数)
- 此算法主要三部分组成:
- for(i=1;i<=n;i++)
father[i]=i;//节点祖先初始化为其本身
2.
<span style="white-space:pre"> </span>int find(int a)//判断两个子树是否是同一个祖先
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(a!=father[a])
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>return father[a]=find(father[a]);//这里有个优化,每次返回就把对应路上的节点更新为祖先节点
<span style="white-space:pre"> </span> return father[a];
<span style="white-space:pre"> </span>}
3.void kru()
{
int sum=0;
for(i=1;i<=j;i++)//j代表边数
{
int xx=find(edge[i].st);
int yy=find(edge[i].en);
if(xx!=yy)//不是同一祖先说明可以连接这两个节点
{
father[xx]=yy;//任意赋值都可
sum+=edge[i].len;//记录权值和
}
}
}
当然这里还有要注意的地方,就是最先数据的输入:
<span style="font-size:18px;">struct node
{
int st,en,len;//记录头结点,尾节点,节点间的边长
}edge[n*(n-1)/2];
int j;//记录边数,每次更新了一条边,j++
比如:edge[j].st=a;edge[j].en=b;edge[j].len=c;j++;
bool cmp(node a,node b)//结构体排序使用
{
if(a.len<b.len)
return 1;
else
return 0;
}
sort(edge+1,edge+1+j,cmp);//排序很重要,顺序排,保证kru算法的正确性</span>