读书人

kruskal算法的有关问题

发布时间: 2012-03-09 21:42:55 作者: rapoo

kruskal算法的问题

C/C++ code
#include <iostream>using namespace std;const int SIZE = 102;struct Node{    int start;    int over;    int len;};int father[SIZE];int Cmp(const void *a, const void *b){    return (*(Node *)a).len > (*(Node *)b).len ? 1 : -1;    }int Find(int n){    while(n != father[n])        n = father[n];    return n;}int main(){    Node arr[5000];    int n, edge, i, sum, num, fa, fb;    cout << "请输入节点的数目:";    cin >> n;    for(i=1;i<=n;i++)        father[i] = i;    edge = n * (n-1) / 2;    cout << "请输入" << edge << "条路的起点,终点,距离:(假设每两个结点之间都直接连通)\n";    for(i=0;i<edge;i++)        cin >> arr[i].start >> arr[i].over >> arr[i].len;    qsort(arr, edge, sizeof(arr[0]), Cmp);    sum = 0;    num = 1;    for(i=0;i<edge;i++)    {        if(num >= n)            break;        fa = arr[i].start;        fb = arr[i].over;        fa = Find(fa);        fb = Find(fb);        if(fa != fb)        {            sum += arr[i].len;            num++;            if(fa < fb)                      //这里                father[fb] = fa;            else                father[fa] = fb;        }    }    cout << "最小生成树的总长度是: " << sum << endl;    return 0;}/*输入:41 2 11 3 41 4 12 3 32 4 23 4 5输出:5*/


以上是一个kruskal算法,我觉得
if(fa < fb)
father[fb] = fa;
else
father[fa] = fb;

这里,好像不加判断,直接写成 father[fb] = fa; 这样也没有什么问题,都能把两棵树连在一起
但为什么大多数教材和网上的程序都加了这个判断呢?这样做有什么好处吗?还是我理解错了?

[解决办法]
自己研究并查集该怎样实现,什么写法是写出什么复杂度的。这个其实不关kruskal事。kruskal只是直接应用了这个数据结构而已。
[解决办法]
你这里面的并查集根本没优化 比较那个大小也没什么意义 而且偏向于根节点序号大的始终放到序号小的树下面 情况只有更槽
在根节点记录的是子节点个数的时候(一般用负数表示) 比较大小再决定哪颗树放到另一颗下面才有意义

读书人网 >软件架构设计

热点推荐