图论之kruskal算法

kruskal算法是图论中用于构造最小生成树的一种算法,其时间复杂度为O(e log e)。该算法主要包括节点祖先初始化为自身的过程,以及后续的边选择和并查集操作来避免环的出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • kruskal算法是一种生成最小生成树的经典算法,时间复杂度为eloge(e为边数)
  • 此算法主要三部分组成:
  1.  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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值