数据结构复习——最小生成树之kruskal算法(逐步加入边)

1、基本原理。

算法图示:


2、实现。

//用以表示图中的边的结构体
struct Arc
{
    unsigned start_; //起始顶点
    unsigned end_;   //终止结点
    unsigned value_; //边的权值
    Arc():
       start_(-1),
       end_(-1),
       value_(unsigned(-1))
    {
    }
};

void transferGraphArray2ArcArray(unsigned graph[MAX_VERTEX][MAX_VERTEX],std::vector<Arc>& arcArray)
{
    Arc temp;
    for(int i=0;i<MAX_VERTEX;++i)
    {
        for(int j=MAX_VERTEX-1;j>=i;--j)
        {
            if(graph[i][j]!=unsigned(-1))
            {
                temp.start_=i;
                temp.end_=j;
                temp.value_=graph[i][j];
                arcArray.push_back(temp);
            }
        }
    }
}

bool compare(Arc a,Arc b)
{
    return a.value_<b.value_?true:false;
}

bool findTwoNodeInDiffTree(unsigned u,unsigned v,std::vector<std::vector<unsigned>>& treeArray)
{
    unsigned indexU=-1;
    unsigned indexV=-1;
    for(unsigned i=0;i<treeArray.size();++i)
    {
        if(std::find(treeArray[i].begin(),treeArray[i].end(),u)!=treeArray[i].end())
            indexU=i;

        if(std::find(treeArray[i].begin(),treeArray[i].end(),v)!=treeArray[i].end())
            indexV=i;
    }

    if(indexU!=indexV)
    {
        for(unsigned i=0;i<treeArray[indexV].size();++i)
        {
            treeArray[indexU].push_back(treeArray[indexV][i]);
        }

        treeArray[indexV].clear();
        return true;
    }

    return false;
}

//最小生成树之——kruskal算法
void kruskalAlgorithm(unsigned graph[MAX_VERTEX][MAX_VERTEX])
{
    std::vector<Arc> arcArray;
    transferGraphArray2ArcArray(graph,arcArray);

    std::sort(arcArray.begin(),arcArray.end(),compare);
    std::vector<std::vector<unsigned>> treeArray(MAX_VERTEX);

    //各个顶点自己独立构成一棵树
    for(int i=0;i<MAX_VERTEX;++i)
    {
        treeArray[i].push_back(i);
    }


    for(unsigned i=0;i<arcArray.size();++i)
    {
        unsigned indexU=arcArray[i].start_;
        unsigned indexV=arcArray[i].end_;

        if(findTwoNodeInDiffTree(indexU,indexV,treeArray))
        {
            std::cout<<"eadge add: "<<indexU<<"----------"
                    <<arcArray[i].value_<<"---------->"<<indexV;
            std::cout<<std::endl;
        }

    }
}

//测试函数
int main()
{
    kruskalAlgorithm(graph);
    return 0;
}

3、运行截图,


参考:

[1].https://blog.csdn.net/luoshixian099/article/details/51908175

猜你喜欢

转载自blog.csdn.net/weixin_40825228/article/details/80747749