概念:将图中所有顶点连结,并且使边的总权值最小所形成的树。
算法:
1:初始化一个点a,并把a加入候选点数组point[]中,将所有可能与a相连的点列于数组array;
2:在array中选边<a,array[]>的权值最小的边<a,array[i]>;
3:在图中找权值比array中还小的边替代array中的边;
3:循环1,2步骤;
例题(来自:http://acm.hdu.edu.cn/showproblem.php?pid=1162)
做这道题时,我自己的测试数据没通过。我就认为是刚用的0x7fffffff 即int形的最大值在某个部分溢出了。这个想法本来就不可能发生,因为我没给它做运算,只是作比较用的,并且我的变量时double的不可能超出那么多啊!我真笨。然后我又用输出函数看每一阶段的结果,太不小心,没考虑函数对整体的影响。最后才发现是比较最大值时的初始化位置不对。
我做这题是有点着急了,手工的步骤没写好就写程序,以至于写得非常慢。
这个算法的用途是形成一个权值最小且覆盖整个图的树即最小生成树的定义。
例题:(hdu1162)
#include<stdio.h>
#include<math.h>
#include<string.h>
double date[101][2];
double distance(double ax,double ay,double bx,double by)
{
return sqrt(pow(ax-bx,2)+pow(ay-by,2));
}
double count(int n)
{
int i,j,now,temp;
double mintree[101],min,dis;
bool sign[101];
memset(sign,1,sizeof(sign));//初始化标记
now=0;
sign[0]=false;
for(i=0;i<n;i++)
mintree[i]=0x7fffffff;//初始化最小生成树
for(i=0;i<n;i++){
temp=now;
min=0x7fffffff;
for(j=0;j<n;j++){
if(min>mintree[j]&&sign[j]){//找下一个扩展点
min=mintree[j];
temp=j;
}
}
now=temp;/////////////////////////////替换当前点
sign[now]=false;//////////////////////标记以经扩展的点
for(j=0;j<n;j++){
dis=distance(date[j][0],date[j][1],date[now][0],date[now][1]);//刷新备选树
if(dis<mintree[j]&&sign[j]){
mintree[j]=dis;
}
}
}
dis=0;
for(i=1;i<n;i++)
dis+=mintree[i];
return dis;
}
main()
{
int n;
int i;
while(scanf("%d",&n)!=-1){
for(i=0;i<n;i++)
scanf("%lf%lf",&date[i][0],&date[i][1]);
printf("%.2lf/n",count(n));
}
return 0;
}
分享到:
相关推荐
在计算机科学中,最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,尤其是在网络设计和优化问题中广泛应用。最小生成树允许我们找到一个无向加权图的所有节点间连接的边集合,使得这个集合构成的树...
最小生成树计数是图论中的一个重要问题,它在计算机科学和网络设计中有着广泛的应用。这个主题主要涉及如何找到一个无向加权图的最小生成树(MST)的所有可能组合,并计算这些生成树的数量。在这个解题报告中,我们...
最小生成树(Minimum Spanning Tree, MST)是网络分析中的一个重要概念,尤其在解决连接多个节点的最小成本网络问题时非常实用。这个主题主要涉及到图论,它在构建通信网络、交通规划、社交网络分析等多个领域都有...
最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,主要应用于寻找一个无向加权图中连接所有顶点的边的集合,使得这些边的总权重尽可能小。这个问题在实际生活中有着广泛的应用,例如电信网络设计、...
代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小生成树Prim算法代码代码 最小...
采用堆排序实现带权值的边的顺序排列 利用克鲁斯卡尔算法实现最小生成树 首先 n城市之间全连接 输出所有连接和其边的权值 最后输出n个城市之间通信代价最小的最小生成树。 可用于java数据结构课程设计:“若要在n个...
最小生成树是图论中的一个重要概念,用于寻找一个加权无向图的边集合,使得这些边连接所有顶点并且权值之和最小。在这个实验报告中,主要探讨了如何使用PRIM算法来构建最小生成树。PRIM算法是一种贪心算法,其核心...
问题描述:给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。基本要求:1、城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义...
最小生成树_Prim算法实现C++ 在计算机科学中,Prim算法是一种常用的最小生成树算法,它可以用于解决无向图的最小生成树问题。 Prim算法的主要思想是,从某个起始点开始,逐步添加边,直到所有顶点都被连接。 在...
### 数据结构——图的最小生成树(邻接矩阵、普利姆) #### 概述 在计算机科学领域,图是一种非常重要的数据结构,用于表示实体之间的关系。在图论中,一个图由顶点集(节点)和边集组成,其中边连接两个顶点来...
根据给定文件的信息,本文将深入探讨两种构造最小生成树的经典算法——普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法,并通过具体的代码实现来展示这两种算法的应用场景与实现细节。 ### 一、最小生成树概念 #### ...
数据结构最小生成树C代码详解 在计算机科学中,数据结构是指计算机中组织和存储数据的方式,包括数组、链表、栈、队列、树、图等。图是一种非线性数据结构, 由节点和边组成,节点之间通过边相连。最小生成树是图论...
最小生成树问题是一个经典的图论问题,用于寻找加权无向图中权重和最小的树形子图,这个子图连接图中所有顶点且不包含环。在计算机科学和网络设计等领域有着广泛的应用。最小生成树问题有两种常见的解决算法:Prim...
最小生成树是图论中的一个重要概念,特别是在网络优化和数据结构的学习中占据着核心地位。在给定的网络中,如果各个节点代表城市,而边代表连接城市之间的通讯线路,那么构建最小生成树的目标就是在满足所有城市都能...
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题 2、利用克鲁斯卡尔算法求网的最小生成树; 3、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列; 4、输入为存在边的顶点对,以及它们之间...
### 使用Prim和Kruskal算法构建最小生成树 在图论中,最小生成树(Minimum Spanning Tree, MST)是一个非常重要的概念。对于一个连通的无向图来说,如果存在一个子图,它包含原图的所有顶点,并且这些顶点通过边...
最小生成树课程设计,给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。构造可以使n个城市连接的最小生成树
编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。
最小生成树是图论中的一个核心概念,主要应用于网络设计、资源分配等领域,它寻找一个树形子图,连接图中的所有顶点,并且使得这个子图的所有边的权重之和最小。这个问题在计算机科学中有着广泛的应用,比如在设计...
最小生成树是图论中的一个重要概念,用于寻找一个无向加权图的边集合,使得这些边连接了图中的所有顶点,且总权重尽可能小。在这个集合中,任何两个顶点之间都有一条路径,但不存在环路。在实际应用中,如网络设计、...