使用克鲁斯卡尔算法为以下无向图构造出一棵最小生成树,请画出构造的每一步骤
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用克鲁斯卡尔算法为以下无向图构造出一棵最小生成树,请画出构造的每一步骤相关的知识,希望对你有一定的参考价值。
参考技术A 额我就写出来怎么构造最小生成树吧。。。我也不记得这个是克鲁斯卡尔算法还是普利姆算法了,这俩我都搞混了...先选点7(这是任意的),找最小边6将1加入树,然后由1的那条向下的4边将6加入树,然后用18的边将2加入树,然后用5的边将3加入树,然后用8的边将4加入树,最后用12的边将5加入树。追答
看了一下……上面那个是普里姆算法 克鲁斯卡尔算法是并查集 具体的百度一下“并查集”就可以了 一般来说求最小生成🌲多用prim 具体原因你可以思考一下
本回答被提问者和网友采纳C语言数据结构 克鲁斯卡尔算法求无向网的最小生成树。
输入:
输入数据第一行为两个正整数n和m,分别表示顶点数和边数。后面紧跟m行数据,每行数据是一条边的信息,包括三个数字,分别表示该边的两个顶点和边上的权值。
输出:
按顺序输出Kruskal算法求得的最小生成树的边集,每行一条边,包括三个数字,分别是该边的两个顶点和边上的权值,其中第一个顶点的编号应小于第二个顶点的编号。
示例输入
8 11
1 2 3
1 4 5
1 6 18
2 4 7
2 5 6
3 5 10
3 8 20
4 6 15
4 7 11
5 7 8
5 8 12
示例输出
1 2 3
1 4 5
2 5 6
5 7 8
3 5 10
5 8 12
4 6 15
#include <algorithm>
#include <stdio.h>
using namespace std;
#define MAXN 1005 //假设点数不超过1000
int n,m;
int fa[MAXN];
int id[MAXN];
struct Edge //边的数据结构
int from, to;
int len;
;
Edge edge[MAXN * MAXN];
bool cmp(Edge a, Edge b) //边的比较函数
return a.len < b.len;
int find(int x) //并查集,用于判断是否与已选择的边构成环
if (fa[x] == -1)
return x;
else
return fa[x] = find(fa[x]);
void Kruskal(int n)
memset(fa, -1, sizeof(fa)); //初始化fa数组
int cnt = 0;
for (int i = 0; i < m; i++)
int u = edge[i].from;
int v = edge[i].to;
int t1 = find(u); //找第一个点的起始点
int t2 = find(v); //找第二个点的起始点
if (t1 != t2) //如果不相等,则不构成回路
fa[t1] = t2;
id[cnt]=i;
cnt++;
if (cnt == n - 1) //当已选了n-1条边时,退出循环
break;
int main()
while(scanf("%d%d",&n,&m))
int a,b,c;
for(int i=0;i<m;i++)
scanf("%d%d%d",&a,&b,&c);
edge[i].from=min(a,b);
edge[i].to=max(a,b);
edge[i].len=c;
sort(edge,edge+m,cmp);
Kruskal(n);
for(int i=0;i<n-1;i++)
int t=id[i];
printf("%d %d %d\\n",edge[t].from,edge[t].to,edge[t].len);
return 0;
参考技术A 太难了,不会,没听说过这算法
以上是关于使用克鲁斯卡尔算法为以下无向图构造出一棵最小生成树,请画出构造的每一步骤的主要内容,如果未能解决你的问题,请参考以下文章