此题数组大小非常重要

算法过程:

  • 现将全部边按照权值(由小到大)排序。
  • 按顺序(同上)考虑每条边,只要这条边和之前已选择的边不构成圈,就保留这条边,否则放弃这条边。

具体算法

  • 成功选择(n-1)条边后,形成一颗最小生成树,如果无法选择出(n-1)条边,则说明不连通。
  • 当所有的点都连到一起时,执行结束。

为何是n-1条边呢?

上图形式可转化为下图形式【图中共有n个圆,共有(n-1)条边】

变!

是不是非常简单易懂?

在此附上详细代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. using namespace std;
  5. int parent[];
  6. int n,m;
  7. int i,j;
  8. struct edge
  9. {
  10. int u,v,w; //边的顶点,权值
  11. }edges[];
  12. //初始化并查集
  13. void UFset()
  14. {
  15. for(i=;i<=n;i++)
  16. parent[i] = -;
  17. }
  18. //查找i的根
  19. int find(int i)
    {
  20. int temp;
  21. //查找位置
  22. for(temp=i;parent[temp]>=;temp=parent[temp]);
  23. //压缩路径
  24. while(temp!=i){
  25. int t=parent[i];
  26. parent[i]=temp;
  27. i=t;
  28. }
  29. return temp;
  30. }
  31. //合并两个元素a,b
  32. void merge(int a,int b){
  33. int r1=find(a);
  34. int r2=find(b);
  35. int tmp=parent[r1] + parent[r2]; //两个集合结点数的和
  36. if(parent[r1]>parent[r2])//秩排序 优化
  37. {
  38. parent[r1]=r2;
  39. parent[r2]=tmp;
  40. }else{
  41. parent[r2]=r1;
  42. parent[r1]=tmp;
  43. }
  44. }
  45. void kruskal()
  46. {
  47. int sumWeight=;
  48. int num=;
  49. int u,v;
  50. UFset();
  51. for(int i=;i<m;i++)
  52. {
  53. u=edges[i].u;
  54. v=edges[i].v;
  55. //一个结点一个结点算
  56. if(find(u)!=find(v))
  57. { //u和v不在一个集合(能够围成一个圈,即在同一个集合中)
  58. sumWeight+=edges[i].w;//计算权值总和
  59. num++;//计算次数,根据需要添加,可不加
  60. merge(u,v); //把这两个边加入一个集合。
  61. }
  62. }
  63. printf("%d \n",sumWeight);
  64. }
  65. //排序
  66. int cmp(const void * a, const void * b){
  67. edge * e1 = (edge *)a;
  68. edge * e2 = (edge *)b;
  69. return e1->w - e2->w;
  70. }
  71. int main() {
  72. scanf("%d %d", &n,&m);
  73. for(i=; i<m; i++)
  74. {
  75. scanf("%d %d %d", &edges[i].u,&edges[i].v,&edges[i].w);
  76. }
  77. qsort(edges,m,sizeof(edge),cmp);//按权值排序
  78. kruskal();//
  79. return ;
  80. }

时间复杂度:O(NlogN)【N是结点个数】

 Happy ending!

P3366 最小生成树【模板+Kruscal讲解】的更多相关文章

  1. luogu p3366 最小生成树模板

    倒腾了一个小时  自己也没去看网上的 总算自己能写出来模板了 kruskal //最小生成树 每次找最短的边 #include<bits/stdc++.h> using namespace ...

  2. 洛谷P3366 【模板】最小生成树 题解

    题目链接:https://www.luogu.org/problem/P3366 最小生成树模板题. Kruskal算法 算法思想:给边按边权从小到大排序,然后遍历每一条边,如果边上的两个点不在同一个 ...

  3. 洛谷P3366 【模板】最小生成树

    P3366 [模板]最小生成树 319通过 791提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 里面没有要输出orz的测试点 如果你用Prim写了半天都是W- 题目 ...

  4. P3366 【模板】最小生成树(boruvka/sollin)

    P3366 [模板]最小生成树 boruvka/sollin 复杂度$O(mlogn)$ 简要说明一下过程 引入一个数组$link[i]$表示连通块$i$下一步可更新的最短的边的编号 1.每次枚举所有 ...

  5. 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

  6. 【原创】洛谷 LUOGU P3366 【模板】最小生成树

    P3366 [模板]最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N ...

  7. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

  8. P3366【模板】最小生成树

    P3366[模板]最小生成树 Kruskal #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ...

  9. hiho 1098 最小生成树二·Kruscal算法 (最小生成树)

    题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...

随机推荐

  1. pat04-树7. Search in a Binary Search Tree (25)

    04-树7. Search in a Binary Search Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 ...

  2. python 在windows下监听键盘按键

    python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...

  3. 定制Linux

    tar -xzvf linux-major-minor-VERSION.tar.gz -C /usr/src cd /usr/src ln -sv linux-major-minor-VERSION ...

  4. 认识web

    URL详解: URL是Uniform Resource Locator 的简写,统一资源定位符. 一个URL由以下几部分组成: scheme:代表的是访问的协议,一般为http或者https以及ftp ...

  5. Devexpress Xtrareports 创建多栏报表

    根据官方回答:多列或多行(取决于当前的多栏设置)呈现数据的报表 这种报表是有用的,例如,当每个明细区都只显示少量数据.并且需要在一列的右侧打印下一个明细区时,这样就能充分利用整个页面的宽度,此外,当创 ...

  6. asp实现网页浏览总数

    <% AlldayView=0 Set Rs=Server.CreateObject("Adodb.RecordSet") Sql="select * from v ...

  7. intellijidea课程 intellijidea神器使用技巧 3-2 livetemplate

    创建livetemplate分组: ctrl shift a ==> live templates ==> + ==> templates group 创建livetemplate模 ...

  8. vueHistory 模式下,布置到服务器上路由刷新会报nginx404错误

    之前写完vue项目后,布置到服务器,用nginx反向代理后,一开始进去,进各种路由都是没问题的,但是一旦f5刷新后就会出现一个nginx404的错误. 经过翻阅vue文档后,发现这是vueHistor ...

  9. oracle笔记1:-安装-体系结构-基本查询

    一.Oracle数据库的安装(安装在虚拟机的xp系统里)     1.安装虚拟机     2.虚拟机内安装xp系统,以下步骤在虚拟机内进行     3.双击setup.exe,在出现的界面中设置口令, ...

  10. nProtect APPGuard安卓反外挂分析

    工具与环境: IDA7.0 JEB2.2.5 Nexus 5 Android 4.4 目录: 一:app简单分析与java层反编译 二: compatible.so反调试与反反调试 三: compat ...