您的位置:首页 > 其它

图论之kruskal算法

2016-08-01 15:32 471 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kruskal 图论