最小生成树

爱被打了一巴掌 2022-05-30 08:56 266阅读 0赞

有n个城市,m条道路,现在输入n到m的道路的长度,用最少的边将图连接,输出让图连接的最小值

这道题我研究了好长时间才把答案看明白,现在给大家分享一下

具体代码如下

  1. #include<iostream>
  2. using namespace std;
  3. struct edge
  4. {
  5. int u;
  6. int v;
  7. int w;
  8. };//用一个结构体来保存从城市u到城市v的距离w
  9. struct edge e[10];//有小于10条路
  10. int n,m;//定义n个城市,m条路
  11. int f[7]={0},sum=0,count=0;
  12. void quicksort(int left,int right)
  13. {
  14. int i,j;
  15. struct edge t;//定义一个中间转换变量
  16. if(left>right)//如果左边大于右边结束
  17. return;
  18. i=left;//i等于左,j等于右
  19. j=right;
  20. while(i!=j)
  21. {
  22. while(e[j].w>=e[left].w&&i<j)//e[left].w是基准数
  23. j--;//往左走
  24. while(e[i].w<=e[left].w&&i<j)
  25. i++;//往右走
  26. if(i<j)//交换两个数的位置
  27. {
  28. t=e[i];
  29. e[i]=e[j];
  30. e[j]=t;
  31. }
  32. }
  33. //将基准数归位
  34. t=e[left];
  35. e[left]=e[i];
  36. e[i]=t;
  37. quicksort(left,i-1);//继续往左递归处理
  38. quicksort(i+1,right);// 继续往右递归处理
  39. return;
  40. }
  41. //查并集寻找祖先的函数
  42. int getf(int v)
  43. {
  44. if(f[v]==v)
  45. return v;
  46. else
  47. {
  48. f[v]=getf(f[v]);
  49. return f[v];
  50. }
  51. }
  52. //并查集合并两子集合的函数
  53. int merge(int v,int u)//v表示出发城市,u表示到达城市
  54. {
  55. int t1,t2;
  56. t1=getf(v);
  57. t2=getf(u);
  58. if(t1!=t2)
  59. {
  60. f[t2]=t1;
  61. return 1;
  62. }
  63. return 0;
  64. }
  65. int main()
  66. {
  67. int i;//定义一个循环变量
  68. cin>>n>>m;//输入一共有n个城市,m条路
  69. for(i=1;i<=m;i++)
  70. cin>>e[i].u>>e[i].v>>e[i].w;//输入从第u个城市到第v个城市的距离w
  71. quicksort(1,m);//用快速排序的方式按距离从小到大枚举出1到m条边
  72. for(i=1;i<=n;i++)//并查集初始化
  73. f[i]=i;
  74. //Kruskal算法核心部分代码
  75. for(i=1;i<=m;i++)//枚举从小到大的每一条边
  76. {
  77. //判断一条边的两个顶点是否已经连通,即判断是否在统一集合中
  78. if(merge(e[i].u,e[i].v))//如果目前不连接,则选这条边
  79. {
  80. count++;
  81. sum=sum+e[i].w;
  82. }
  83. if(count==n-1)//选用n-1条边,跳出循环
  84. break;
  85. }
  86. cout<<sum<<endl;//输出最短距离
  87. return 0;
  88. }

博主本身也是小白,希望大家在评论区分享更好的方法,大家相互学习,共同进步

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读

    相关 生成

    最小生成树定义: 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即![(u, v)\\in E][u_ v_in E]),而

    相关 生成

    一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树在n个顶点的情形下,有n-1条边。生成树是对连

    相关 生成

    有n个城市,m条道路,现在输入n到m的道路的长度,用最少的边将图连接,输出让图连接的最小值 这道题我研究了好长时间才把答案看明白,现在给大家分享一下 具体代码如下

    相关 生成

    问题提出: 要在n个城市间建立通信联络网。顶点:表示城市,权:城市间通信线路的花费代价。希望此通信网花费代价最小。 问题分析: 答案只能从生成树中找,因为要做到任何

    相关 生成

    kruskal算法基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直到遍历完所有的边。 p

    相关 生成

    最小生成树 什么是最小生成树 给定一张无向带权图G=(V,E,W),从中挑选出|V|-1条边,使得V中任意两点都有直接或者间接的路径 显然,最后得到的子