感谢这篇文章
本文对其代码,进行一些解释。

这道题的题意很明了。求最大边与最小边差值最小的生成树

首先,把所有的生成树都求出来是不可能的,所以,必须用别的方法。

在学习次小生成树的过程中,知道了一个最小生成树的性质, 一个图的最小生成树不一定是唯一的,但是组成这些最小生成树的各个边的权值一定都是一一对应相同的。不会出现这种一个树上有两个边权值a+b等于另外一颗树上两个边c+d,然后这两个树都是最小生成树的情况。

对于本题来讲,上面那个性质就说明了一个图的最小生成树上的最小边的权值和最大边的权值是固定不变的。那么当使用克鲁斯卡尔算法时,第一次加入的必然是边权最小的边,由于克鲁斯卡尔算法的正确性已经得到验证过,那么此边的权值必然就是最小生成树的最小边权值了,当最小边的权值固定时,最小生成树的最大边的权值也“命中注定”是固定的,在最小边权值固定的情况下,其他的生成树的最大边必然也是大于等于最小生成树的最大边,否则就不满足我们上文提到的性质,这就是“当生成树的最小边确定时,最小生成树的最大边的权值是所有生成树中最小的”。从而,我们得到了一个本题的解法。 枚举最小边,然后求最小生成树,更新最优解。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<set>
//#include<unordered_map>
#include<ctime>
using namespace std;
typedef long long ll;
#define pi pair<int,int>
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define INF 0x3f3f3f3fconst int N = 1e4 + 10;// e[i] 表示第i条边的信息(连接u和v,权值为w)
struct edge
{int u, v, w;edge(int u1=0,int v1=0,int w1=0):u(u1),v(v1),w(w1){}bool operator <(const edge e1){return this->w < e1.w;}
}e[N];bool vis[N];
int n, m;
int fa[N];void init()
{for (int i = 0; i <= n; ++i)fa[i] = i;
}int find(int x)
{if (fa[x] == x)return x;elsereturn fa[x] = find(fa[x]);
}void join(int x,int y)
{x = find(x);y = find(y);if (x != y)fa[x] = fa[y];
}bool same(int a, int b)
{return find(a) == find(b);
}int Kruskal()
{sort(e + 1, e + m+1);int flag = 0, ans = INF;//枚举每一个最小边,for (int i = 1; i <= m; ++i){init();//并查集初始化int cnt = 1;//以该边来构建最小生成树的最大边权,和最小边权int hight = e[i].w, low = e[i].w;//加入这条边join(e[i].u, e[i].v);//从该边后面的边选边组成最小生成树for (int j = i+1 ; j <= m; ++j){if (!same(e[j].u, e[j].v)){join(e[j].u, e[j].v);hight = max(hight, e[j].w);cnt++;}if (cnt == n - 1)break;}if (cnt == n - 1)//如果能构成了最小生成树{flag = 1;//更新ans = min(ans, hight - low);}}if (!flag)return -1;elsereturn ans;
}int main()
{while (~scanf_s("%d%d", &n, &m)&&(n||m)){mst(e, 0);for (int i = 1; i <= m; ++i)scanf_s("%d%d%d", &e[i].u, &e[i].v, &e[i].w);printf("%d\n", Kruskal());}return 0;
}

POJ3522Slim Span(最大边与最小边差值最小的生成树)相关推荐

  1. 将一个数组划分为和差值最小的子数组

    要求:将数组中的数划分为两组,使得两个子数组的和的差值最小,数组中的数的取值范围为0<X<100,元素个数也是大于0小于100.如:a[]={2,4,5,6,7},得出的两组数:{2,4, ...

  2. Poj 3522 最长边与最短边差值最小的生成树

    题意:       让你求一颗生成树,使得最长边和最短边长度差值最小. 思路:      额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在 ...

  3. 在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对

    先求差值最大的: 1.找出最大值和最小值 然后做差,  每次比较相邻的两个数(比如先0,1  然后2,3),然后每次比较记录下最大和最小的差值,可以比较1.5N次得到结果,和分为奇数偶数位比较一样的复 ...

  4. mysql 查找差值最小_mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  5. 18966 两两配对差值最小

    题目描述 拼多多2019秋招部分编程题 给定一个长度为偶数的数组arr,将该数组中的数字两两配对并求和,在这些和中选出最大和最小值, 请问该如何两两配对,才能让最大值和最小值的差值最小? 输入格式 一 ...

  6. 牛客_求将一个数组分割为两个差值最小的部分

    问题描述: 将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小. /*** @ Author zhangsf* @CreateTime 2019/9/20 - 8 ...

  7. Java 第 21 课 1200. 最小绝对差 539. 最小时间差

    第 21 课 1200. 最小绝对差 539. 最小时间差 基础知识 Java ArrayList 方法 List.of 和 Arrays.asList ArrayList 排序 1200. 最小绝对 ...

  8. 验证哥德巴赫猜想:任何一个偶数(大于2)都可以由两个素数组成,要求输出两个素数差值最小的素数对

    题目描述 任意一个偶数(大于2)都可以由2两个素数组成,组成偶数的2的素数有很多种情况,要求输出组成指定偶数的两个素数差值最小的素数对. 代码实现 import java.util.*; import ...

  9. SQL SERVER 获取差值最小的数据

    分享一个小技巧,获取和自己差值最小的数据,测试数据如下: --测试数据 if not object_id(N'Tempdb..#T1') is nulldrop table #T1 Go Create ...

最新文章

  1. Leetcode 392. 判断子序列 解题思路及C++实现
  2. 多个iis的进程w3wp
  3. golang开发环境配置及Beego框架安装
  4. Pandas使用DataFrame进行数据分析比赛进阶之路(一)
  5. 【window】Windows10下为PHP安装redis扩展
  6. Linux安装SQLite轻量级数据库
  7. iic标准c语言,I2C总线之(三)---以C语言理解IIC
  8. 微软ODBC服务器驱动,Microsoft ODBC 桌面数据库驱动程序
  9. java在线查看PDF
  10. 处理一些 Vue warn 和 sonar 扫描报错
  11. 数学专业偏向算法智力题的面试题
  12. 高德地图开发踩坑记录
  13. 罗技K375s重新配置和连接
  14. 平面直角系【坐标系旋转】、【点绕坐标系旋转】、【A点绕B点旋转】
  15. JavaScript/HTML格式化
  16. 鼠标悬停 -css如何实现鼠标移至图片上显示遮罩层及文字
  17. 代码编辑器--5.21
  18. uni-app 页面切换间的动画,页面跳转之中的动画
  19. win7提权system与后门
  20. STM32——安装keil环境

热门文章

  1. 【放置奇兵】算法 PVE总结
  2. yunyang1994 tensorflow_yolov3 对于检测中心点的边缘物体时评估IOU对召回率和精度的影响
  3. Intel RealsenseD435 color图与depth图的两种对齐(align)方式
  4. 深入浅出python机器学习_9.1.5_通过数据预处理提高模型的准确率_MinMaxScaler
  5. python 安装PIL包的方法以及简单介绍
  6. python matplotlab在jupyter notebook中画图不显示怎么办?(%matplotlib inline)
  7. 深渊水妖 模拟,贪心 牛客白月赛44
  8. 马鞍山职业计算机考试,2020年职业适应性(技能)测试纲要
  9. python时间序列预测报错_python如何做时间序列
  10. mysql中shift h_MySQL复制技术对比与容器化探究