Ⅰ 数据结构里提到的普里母和克鲁斯卡尔分别是哪个国家的
普里母算法和克鲁斯卡尔方法求最小生成树完整程序
1、普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法
2、Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。
Ⅱ 关于克鲁斯卡尔算法中的一点疑问
这是因为采用了并查集这种数据结构。
set[]这个数组在算法中所起的作用不是你想的那样,你去看看并查集的知识,相信你一看就明白了。
Ⅲ 数据结构中图的克鲁斯卡尔算法的基本思想是
基本思想是:设有一个有n个顶点的连通网络N={V,E},最 初先构造一个只有n个顶点,没有边的非连通图 T={ V,¢},图中每个顶点自成一个 连通分量。当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通 分量上,则将此边加人到T中;否则将此边舍去,重新选择一条权值最小的边。如此重复 下去,直到所有顶点在同一个连通分量上为止。
Ⅳ 数据结构中克鲁斯卡尔算法求无向带权连通图的最小生成树
需要,你的结果是2棵树(森林),结果要的是一棵树,当然要连起来
Ⅳ 克鲁斯卡尔算法
哈哈,因为爱情。
parent数组装的是每个连通分量的第一个开始点,最初的状态有n个节点,n个分量,都是第一个,所以全都赋值0,而开始合并后,将一个个的分量逐步的合并到一起,parent记录的就是父节点,一个联通分量只有一个parent为0的。
而判断循环是如果两个的最终的开始节点是同一个,就说明你加上这条边就形成循环了,这条边就不能加
Ⅵ 2014数据结构高分笔记的克鲁斯卡尔算法,没看懂。 getRoot函数那个是怎么做到的
例:
int FindRoot(int a)
{
if(Tree[a]==-1)//没有父节点,返回a
return a;
else
{
int tmp=FindRoot(Tree[a]);//存在父节点,递归返回离根最近的父节点id
Tree[a]=tmp;//将自己的父节点修改为最直接的父节点,使树变矮,优化
return tmp;//返回父节点
}
}
不知道高分笔记的克鲁斯卡尔算法具体怎么实现,但是原理如上
Ⅶ 数据结构克鲁斯卡尔算法,急求
第一步
v1--v2
第二步
v1--v2--v3
第三步
v1--v2--v3--v4
第四步
v1--v2--v3--v4--v5
第五步
v1--v2--v3--v4--v5
--v6
Ⅷ C语言数据结构 克鲁斯卡尔算法求无向网的最小生成树。
//要用到并查集判断回路,代码先给你吧,看不懂追问
#include<algorithm>
#include<stdio.h>
usingnamespacestd;
#defineMAXN1005//假设点数不超过1000
intn,m;
intfa[MAXN];
intid[MAXN];
structEdge{//边的数据结构
intfrom,to;
intlen;
};
Edgeedge[MAXN*MAXN];
boolcmp(Edgea,Edgeb){//边的比较函数
returna.len<b.len;
}
intfind(intx){//并查集,用于判断是否与已选择的边构成环
if(fa[x]==-1)
returnx;
else
returnfa[x]=find(fa[x]);
}
voidKruskal(intn){
memset(fa,-1,sizeof(fa));//初始化fa数组
intcnt=0;
for(inti=0;i<m;i++){
intu=edge[i].from;
intv=edge[i].to;
intt1=find(u);//找第一个点的起始点
intt2=find(v);//找第二个点的起始点
if(t1!=t2){//如果不相等,则不构成回路
fa[t1]=t2;
id[cnt]=i;
cnt++;
if(cnt==n-1)//当已选了n-1条边时,退出循环
break;
}
}
}
intmain()
{
while(scanf("%d%d",&n,&m))
{
inta,b,c;
for(inti=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(inti=0;i<n-1;i++)
{
intt=id[i];
printf("%d%d%d ",edge[t].from,edge[t].to,edge[t].len);
}
}
return0;
}