#inc...">
美文网首页
kruskal (克鲁斯卡尔)最小生成树的C++代码实现

kruskal (克鲁斯卡尔)最小生成树的C++代码实现

作者: 行走小样 | 来源:发表于2019-02-28 21:02 被阅读0次

#include "pch.h"

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

//一个克鲁斯卡尔kruskal算法-最小生成树的c++代码

struct edge

{

int first, last;                                //边的两个端点编号

int cost;                                //边权

edge(int x, int y, int c) :first(x), last(y), cost(c) {}

};

using namespace std;

//二进制函数,接受范围中的两个元素作为参数,并返回可转换为bool的值

bool comp(edge a, edge b)    //b>a 是从小往大了排。b<a 是从大到小排

{

return a.cost < b.cost;

}

//并查集查询函数,返回x所在集合的根节点

//关键性函数!查找给出的顶点的根节点

int FindFather(vector<int> father, int f)

{

int a = f;

while (father[a] != -1)

a = father[a];

return a;

}

//kruskal algorithem

int kruskal(int n, int m, vector<edge>& E)    //n是顶点个数,m 是边的个数,E是边的集合

{

vector<int> father(n);

int sum = 0;

int sum_edge = 0;

for (int i = 0; i < n; i++)

father[i] = -1;

sort(E.begin(), E.end(), comp);                        //STL中自带了sort函数用来对给定区间的所有元素进行排序.

for (int i = 0; i < m; i++)

{

int f_first = FindFather(father, E[i].first);

int f_last = FindFather(father, E[i].last);

//判断两个顶点的根节点是否是同一个,不是的话就说明两个“树”不是联通的,然后令f_last的根节点等于first,使其连通,就实现了合并

if (f_first != f_last)       

{

father[f_last] = f_first;

sum += E[i].cost;

sum_edge++;

if (sum_edge == (n - 1))

break;

}

}

if (sum_edge != (n - 1))

return 0;

else

return sum;

}

int main()

{

vector<edge> E = { edge(0,1,4),edge(1,2,1),edge(2,3,6),edge(3,4,5),edge(0,4,1),

  edge(0,5,2),edge(1,5,3),edge(2,5,5),edge(3,5,4),edge(4,5,3) };

int n = 6;

int m = 10;

int res = kruskal(n, m, E);

cout << res << endl;

}

结果输出为  11

有问题的朋友可以评论区提问,一起讨论共同进步

相关文章

网友评论

      本文标题:kruskal (克鲁斯卡尔)最小生成树的C++代码实现

      本文链接:https://www.haomeiwen.com/subject/zzxluqtx.html