【题意】

给出一个\(n(n<=100)\)个节点的的图,求最大边减最小边尽量小的生成树。

【算法】

\(Kruskal\)

【分析】

首先把边按边权从小到大进行排序。对于一个连续的边集区间\([L,R]\),如果这些边使得\(n\)个点全部联通,则一定存在一个苗条度不超过\(W[R]-W[L]\)的生成树(其中\(W[i]\)表示排序后第\(i\)条边的权值)。

从小到大枚举\(L\),对于每个\(L\),从小到大枚举\(R\),同时用并查集将新进入\([L,R]\)的边两端的点合并成一个集合,与\(Kruskal\)算法一样。当所有的点都联通是停止枚举\(R\),换下一个\(L\)(并且把\(R\)重置为\(L\)),继续枚举。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100+10;
const int MAXM=10000+10;
int n,m;
int fa[MAXN];
int maxn,ans=0x3f3f3f3f;
struct Node
{int u,v,w;
}edge[MAXM];
inline int read()
{int tot=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9'){tot=tot*10+c-'0';c=getchar(); }return tot;
}
inline bool cmp(Node x,Node y)
{return x.w<y.w;
}
inline int find(int k)//并查集
{if(fa[k]==k)return k;else return fa[k]=find(fa[k]);
}
inline bool kruskal(int k)//判断是否能形成生成树
{maxn=0;int tot=0;for(int i=1;i<=n;i++)fa[i]=i;for(int i=k;i<=m;i++){if(fa[find(edge[i].u)]!=fa[find(edge[i].v)]){maxn=edge[i].w;fa[find(edge[i].u)]=fa[find(edge[i].v)];tot++;}if(tot==n-1)return 1;//如果所有点都联通,则返回true}return 0;//否则返回false
}
int main()
{while(1){ans=0x3f3f3f3f;n=read();m=read();if(!n&&!m)break;for(int i=1;i<=m;i++){edge[i].u=read();edge[i].v=read();edge[i].w=read();}sort(edge+1,edge+1+m,cmp);//给边进行从小到大排序for(int i=1;i<=m;i++)//枚举L{if(kruskal(i)){ans=min(ans,maxn-edge[i].w);//更新最小值}}if(ans!=0x3f3f3f3f)cout<<ans<<endl;else cout<<-1<<endl;//特判}return 0;
}

刘汝佳大法好!

转载于:https://www.cnblogs.com/hulean/p/11123027.html

洛谷 题解 UVA1395 【苗条的生成树 Slim Span】相关推荐

  1. 洛谷 UVA1395 苗条的生成树 Slim Span

    题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...

  2. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  3. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  4. 洛谷题解——P2814 家谱

    题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P2814. MYOJ,http://47.110.135.197/problem.php?id=5344. ...

  5. 【洛谷题解】P2433 【深基1-2】小学数学 N 合一

    目录 [深基1-2]小学数学 N 合一 题解 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 题目解析 问题 1~5 问题 6~10 问题 10~14 发牢骚 完整代码 谢谢 ...

  6. 洛谷题解——P1621 集合

    题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P1621. MYOJ,http://47.110.135.197/problem.php?id=5342. ...

  7. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  8. 洛谷题解——P1024:一元三次方程求解

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1qT4y13717/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  9. 题解系列009 | 洛谷题解 CF488A 【Giga Tower】

    原题传送门:Giga Tower 一.题意 题目(传送门)给一个绝对值不超过十位的整数,想计算至多加几后会在和数中出现数字 888. 二.分析 看到这道题,我们最容易想到的当然是暴力枚举,但是首先需要 ...

  10. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

最新文章

  1. 【工具】TFT彩屏图片点阵取模工具,Img2Lcd图片取模软件,图片生成c语言头文件...
  2. java sql参数_java-从SQL查询检索参数
  3. Windows、Linux系统安装JDK配置Java环境变量
  4. Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化
  5. 通用ShellCode深入剖析
  6. mysql 1054 42s22_MySQL 触发器的坑:ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'
  7. 第一个spring冲刺团队贡献分(80分满分)
  8. Docker生产环境配置——设置direct-lvm模式
  9. linux内存测试工具memtest,Linux基础教程:内存测试工具(Memtest86+)
  10. 2021牛客多校#10 F-Train Wreck
  11. 华为ensp配置AC+AP多个SSID信号
  12. 浪潮存储加速国产替代
  13. 计算机网络在资源共享信息交换的体会,计算机网络学习心得体会.doc
  14. linux 环境下安装dubbo管理控制台 dubbo admin
  15. 软考下午常见问题——个人笔记
  16. 计算机毕业设计Java城市出行行程智能推荐系统(源码+系统+mysql数据库+lw文档)
  17. Linux下的CPU性能瓶颈分析案例
  18. EAN13条形码了解,有c测试代码
  19. Galgames Hgames下载中心,无毒
  20. 头像上传(限制大小,格式,尺寸)

热门文章

  1. H3C WAC360 基于Win2012 NPS 802.1x 认证
  2. [HihoCoder1369]网络流一·Ford-Fulkerson算法
  3. fastjson SerializerFeature
  4. 0.python class
  5. JAX-RS (REST Web Services) 2.0 requires Java 1.7 o
  6. Servlet和JSP学习指南
  7. Windows服务器系统的端口要求
  8. KE之undefinded instruction问题记录
  9. linux下测试磁盘的读写IO速度(IO物理测速)
  10. Linux内核部件分析 更强的链表klist