2024年10月克鲁斯卡尔算法c++(求大神,hdu1102最小生成树,为什么会超时代码如下:谢谢!!!)

 更新时间:2024-10-12

  ⑴克鲁斯卡尔算法c++(求大神,hdu最小生成树,为什么会超时代码如下:谢谢!!!

  ⑵求大神,hdu最小生成树,为什么会超时代码如下:谢谢!!!

  ⑶最小生成树克鲁斯卡尔算法。/*有些点城镇已经连通好了但是我们在做的时候是求剩下的连通起来要花多少钱我们可以依然把这些已经连通好的边放进我们将要连通的所有边中不过花费是这样依旧求出的是最短路注意找的是最短路*/#include《stdio.h》#include《stdlib.h》intmap;structhaha{intview;intview;intvalue;}e;intparent;intcmp(constvoid*a,constvoid*b){return(*(structhaha*)a).value-(*(structhaha*)b).value;}intget_root(intx){returnx==parent);}intjoin(intx,inty){introot,root;root=get_root(x);root=get_root(y);//printf(“root=%droot=%d

  ⑷“,root,root);if(root==root)return;elseparent=root;return;}intmain(){inti,j,n,k,x,y,c,ans;while(scanf(“%d“,&n)!=EOF){c=;ans=;for(i=;i《=n;i++)for(j=;j《=n;j++)scanf(“%d“,?);for(i=;i《=n;i++)for(j=;j《=n;j++){if(map){e.view=i;e.view=j;e;c++;}}for(i=;i《=;i++)parent=i;scanf(“%d“,&k);i=c;for(c;c《i+k;c++){scanf(“%d%d“,&x,&y);e.view=x;e.view=y;e.value=;}//printf(“%d“,c);qsort(e+,c-,sizeof(e),cmp);//for(i=;i《c;i++)//printf(“value=%d

  ⑸“,e.value);//printf(“c=%d

  ⑹“,c);for(i=;i《c;i++){//printf(“i=%d:“,i);if(join(e.view)){ans=ans+e.value;}}printf(“%d

  ⑺“,ans);}return;}

  ⑻求最小生成树利用Kruskal算法求图G的一棵最小生成树T,用c语言

  ⑼#include《cstdlib》#include《iostream》#include《queue》usingnamespacestd;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:并查集存储结构//Tags:值为-则表示为根节点structDisjointSet{int*arr;//值为父节点下标intnumber;//arr元素个数};/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:初始化并查集结构//Input:number-元素的个数//Output:s-number个元素自成一集的并查集voidInitSet(DisjointSet&s,intnumber){s.number=number;s.arr=newint;memset(s.arr,-,sizeof(int)*number);}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:删除并查集结构//Input:s-并查集存储结构//Output:s-回收内存后的结构voidFreeSet(DisjointSet&s){if(s.arr){deletes.arr;s.number=;}}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:获得某个结点的根节点//Input:s-并查集;index-结点下标//Output:return-根节点下标intGetRoot(DisjointSet&s,intindex){while(s.arr!=-)index=s.arr;returnindex;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:合并index和index所在的两个集合//Input:index-结点下标,index-结点下标//Output:s-并查集voidUnion(DisjointSet&s,intindex,intindex){introot=GetRoot(s,index);introot=GetRoot(s,index);s.arr=root;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:判断两个结点是否在同一个集合中//Input:s-并查集,index-结点下标,index-结点下标//Output:return-true:在false:不在boolFind(DisjointSet&s,intindex,intindex){returnGetRoot(s,index)==GetRoot(s,index);}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:图的邻接矩阵structGraph{int**value;//权值,-表示无法到达intnumber;};/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:初始化一个图//Input:g-图的存储结构,number-结点个数//Output:g-图voidInitGraph(Graph&g,intnumber){inti=;g.value=newint*;for(i=;i《number;i++)g.value;g.number=number;memset(*g.value,-,sizeof(int)*number*number);}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:回收一个图//Input:g-图,number-结点个数//Output:g-图的存储结构voidFreeGraph(Graph&g){inti=;for(i=;i《g.number;i++)delete;deleteg.value;g.value=;g.number=;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:为图在a,b间添加一条边//Input:e,e-两个结点,value-权值//Output:graph-加边后的图voidAddEdge(Graph&graph,inte,inte,intvalue){graph.value=value;graph.value=value;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:显示一条边structOneEdge{OneEdge(int_a=,int_b=,int_value=):a(_a),b(_b),value(_value){}inta,b;//边的两个结点intvalue;//边的权值};/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:根据权值判断两个边的大小//Tags:由于priority_queue是最大堆,所以这里小于号变成大于号,从而使priority_queue变成最小堆booloperator《(OneEdgee,OneEdgee){if(e.value》e.value)returntrue;elsereturnfalse;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Description:用户输入图的边//Input:n-加边的个数//Output:graph-加边后的图//Tags:Console下用户输入点对(a,b,v)voidInputEdge(Graph&graph,intn){inti=,a,b,v;for(i=;i《n;i++){scanf(“%d%d%d“,&a,&b,&v);AddEdge(graph,a,b,v);}}intmain(){constintNODE_NUMBER=;constintEDGE_NUMBER=;Graphgraph;//图DisjointSetset;//并查集priority_queue《OneEdge》edge;//叉堆InitGraph(graph,NODE_NUMBER);//初始化图InputEdge(graph,EDGE_NUMBER);InitSet(set,NODE_NUMBER);//初始化并查集inti=,j=;//初始化堆for(i=;i《NODE_NUMBER;i++)for(j=i;j《NODE_NUMBER;j++)if(graph.value》)edge.push(OneEdge(i,j,graph.value));intmin_pay=;//最小耗费值intadd_num=;//已经添加了几个边OneEdgemin_value_edge;//当前权值最小边while(add_num《NODE_NUMBER-){min_value_edge=edge.top();//这里是因为了STL中叉堆的结构中有一个缓冲区//需要将缓冲区中的每一个元素弹出来if(min_value_edge.value》&&!Find(set,min_value_edge.a,min_value_edge.b)){Union(set,min_value_edge.a,min_value_edge.b);min_pay+=min_value_edge.value;add_num++;}edge.pop();}printf(“%d“,min_pay);return;}这个是c++语言的,最小权值存储在min_pay中,树存储在并查集set中,且在获取最小权值路径的时候用了STL中的叉堆,算法复杂度为O(|V|*lgE)不知是否满足您的要求

  ⑽其实这个parent数组就是用来判断新选择的边是否和现有的边构成环路这个结构就是一个树的双亲表示,当新边的两个顶点所在的树根不是同一个时,自然就是表示加入这两个顶点间的边不够成环路这种结构通称“并查集”,用来检测等价关系的,这里用来判断顶点是否在一个集合中,可以看比较全面的《数据结构》教材树那个一章的介绍

  ⑾kruskal算法是什么

  ⑿kruskal算法是:克鲁斯卡尔算法。是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge、(e为网中的边数,所以,适合于求边稀疏的网的最小生成树。

  ⒀克鲁斯卡尔(Kruskal算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E,令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{},概述图中每个顶点自成一个连通分量。

  ⒁在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止。

  ⒂克鲁斯卡尔算法的时间复杂度主要由排序方法决定,而克鲁斯卡尔算法的排序方法只与网中边的条数有关,而与网中顶点的个数无关,当使用时间复杂度为O(eloge的排序方法时,克鲁斯卡尔算法的时间复杂度即为O(loge,因此当网的顶点个数较多、而边的条数较少时,使用克鲁斯卡尔算法构造最小生成树效果较好。

  ⒃C++最小生成树,求全代码

  ⒄实在抱歉,昨天的代码有点小错误,做下改正://Minim_tree.cpp#include“Minim_tree.h“#include《iostream》usingnamespacestd;Edge::Edge(){}Minim_tree::Minim_tree(){this-》city=;this-》line=;this-》Ed_len=;this-》Re_len=;this-》CreatEdgesetArray();}voidMinim_tree::CreatEdgesetArray()//构建无线网络{intcit,lin,i,j,w;cout《《“输入城市数,网络数:“《《endl;scanf(“%d%d“,&cit,&lin);this-》city=cit;this-》line=lin;cout《《“请输入各网络边:“《《endl;for(intk=;k《=this-》line;k++){fflush(stdin);scanf(“%d%d%d“,&i,&j,&w);this-》EderSet.fromvex=i;this-》EderSet.endvex=j;this-》EderSet.weight=w;}this-》SetOrder();}voidMinim_tree::SetOrder()//按权值升序排序{Edgetemp;for(inti=;i《=this-》line-;i++)for(intj=i+;j《=this-》line;j++){if(this-》EderSet.weight){temp=this-》EderSet;this-》EderSet;this-》EderSet=temp;}}for(inti=;i《=this-》line-;i++)cout《《this-》EderSet.weight《《endl;}voidMinim_tree::Cruskal(){intmatrix;//此集合用来判断选定的边是否符合克鲁斯卡尔算法的条件for(inti=;i《=this-》line;i++)//初始化集合,使每个懂点分属于对应的集合for(intj=;j《=this-》line;j++){if(i==j)matrix=;//每一个点和它自身都是连通的elsematrix=;}intk=,m,m;while(k《this-》line){for(inti=;i《=this-》line;i++)//取边所在两定点集合所在的序号{if(matrix==)m=i;if(matrix==)m=i;}if(m!=m)//若不等则没有连通{this-》Resul_Set;this-》Re_len++;for(intj=;j《=this-》line;j++){matrix;//合并两个集合matrix=;//置为空集}}this-》Ed_len++;k++;}}voidMinim_tree::Print(){cout《《“根据Cruslkal算法得出以下结果(不唯一:“《《endl;for(inti=;i《this-》Re_len;i++){cout《《this-》Resul_Set.weight《《endl;}}Minim_tree::~Minim_tree(void){}

  ⒅那位c++高手给我分析下克鲁斯卡尔算法该怎么做

  ⒆最小权边是通过先排序再逐个判断的方式来完成,而连通分量的一种高效判定法就是使用并查集(Union-FindSet,或称不相交集合,DisjointSet。并查集网上资料比较多不解释了。

  ⒇克鲁斯卡尔算法的KRUSKAL算法C++程序

  ⒈void?kruskal?(edgeset?ge,?int?n,?int?e)//?ge为权按从小到大排序的边集数组{????int?set=v;j++;}????????i++;}}

  ⒉c加加提问,克鲁斯卡尔算法是什么

  ⒊克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(eloge)。和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树。对于任意一个连通网的最小生成树来说,在要求总的权值最小的情况下,最直接的想法就是将连通网中的所有边按照权值大小进行升序排序,从小到大依次选择。由于最小生成树本身是一棵生成树,所以需要时刻满足以下两点:

  ⒋连接n个顶点在不产生回路的情况下,只需要n-条边。

  ⒌判断是否会产生回路的方法为:在初始状态下给每个顶点赋予不同的标记,对于遍历过程的每条边,其都有两个顶点,判断这两个顶点的标记是否一致,如果一致,说明它们本身就处在一棵树中,如果继续连接就会产生回路;如果不一致,说明它们之间还没有任何关系,可以连接。

  ⒍输入连通网的边数:输入连通网的顶点:输入各边的起始点和终点及权重:,,,,,,,,,,,,,,,,,,,,,,,,,

您可能感兴趣的文章:

相关文章