【题意】

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

【算法】

\(Kruskal\)

【分析】

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

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

【代码】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=100+10;
  4. const int MAXM=10000+10;
  5. int n,m;
  6. int fa[MAXN];
  7. int maxn,ans=0x3f3f3f3f;
  8. struct Node
  9. {
  10. int u,v,w;
  11. }edge[MAXM];
  12. inline int read()
  13. {
  14. int tot=0;
  15. char c=getchar();
  16. while(c<'0'||c>'9')
  17. c=getchar();
  18. while(c>='0'&&c<='9')
  19. {
  20. tot=tot*10+c-'0';
  21. c=getchar();
  22. }
  23. return tot;
  24. }
  25. inline bool cmp(Node x,Node y)
  26. {
  27. return x.w<y.w;
  28. }
  29. inline int find(int k)//并查集
  30. {
  31. if(fa[k]==k)return k;
  32. else return fa[k]=find(fa[k]);
  33. }
  34. inline bool kruskal(int k)//判断是否能形成生成树
  35. {
  36. maxn=0;
  37. int tot=0;
  38. for(int i=1;i<=n;i++)
  39. fa[i]=i;
  40. for(int i=k;i<=m;i++)
  41. {
  42. if(fa[find(edge[i].u)]!=fa[find(edge[i].v)])
  43. {
  44. maxn=edge[i].w;
  45. fa[find(edge[i].u)]=fa[find(edge[i].v)];
  46. tot++;
  47. }
  48. if(tot==n-1)return 1;//如果所有点都联通,则返回true
  49. }
  50. return 0;//否则返回false
  51. }
  52. int main()
  53. {
  54. while(1)
  55. {
  56. ans=0x3f3f3f3f;
  57. n=read();m=read();
  58. if(!n&&!m)break;
  59. for(int i=1;i<=m;i++)
  60. {
  61. edge[i].u=read();
  62. edge[i].v=read();
  63. edge[i].w=read();
  64. }
  65. sort(edge+1,edge+1+m,cmp);//给边进行从小到大排序
  66. for(int i=1;i<=m;i++)//枚举L
  67. {
  68. if(kruskal(i))
  69. {
  70. ans=min(ans,maxn-edge[i].w);//更新最小值
  71. }
  72. }
  73. if(ans!=0x3f3f3f3f)cout<<ans<<endl;
  74. else cout<<-1<<endl;//特判
  75. }
  76. return 0;
  77. }

刘汝佳大法好!

洛谷 题解 UVA1395 【苗条的生成树 Slim Span】的更多相关文章

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

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

  2. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  3. 洛谷P4234 最小差值生成树(LCT,生成树)

    洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最 ...

  4. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  5. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  6. 苗条的生成树 Slim Span--洛谷

    传送门 钢哥终于没给黑题紫题了(卑微v 稍稍需要多想一点点 ---------------------------------------------------------------------- ...

  7. 【刷题】洛谷 P4234 最小差值生成树

    题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的 ...

  8. 洛谷P4234 最小差值生成树(lct动态维护最小生成树)

    题目描述 给定一个标号为从 11 到 nn 的.有 mm 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式:   第一行两个数 n, mn,m ,表示图的点和边的数量. ...

  9. [洛谷P4234] 最小差值生成树

    题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:求一棵生成树,其最大边权减最小边权最小 解题思路 和魔法森林非常像.先对所有边进行排序,每次加边的时候删除环上的最小 ...

随机推荐

  1. learning scala stream collection

    最关键的部分是计算序列的同时,不会引发无限递归, #:: 表达式的右边只有在被请求时才会被求值.

  2. (转)实验文档4:kubernetes集群的监控和日志分析

    改造dubbo-demo-web项目为Tomcat启动项目 Tomcat官网 准备Tomcat的镜像底包 准备tomcat二进制包 运维主机HDSS7-200.host.com上:Tomcat8下载链 ...

  3. Hbase 错误记录分析(1) region超时问题

    错误现象: 默认等待时间是60秒,超过这个时间就报超时问题了.因此需调整超时时间,默认为60秒,在配置文件 hbase-site.xml中: 调整成10分钟 <property>    & ...

  4. [Shell]CVE-2017-8464漏洞复现

    0x01 漏洞原理 Windows系统通过解析 .LNK 后缀文件时,是使用二进制来解析的,而当恶意的二进制代码被系统识别执行的时候就可以实现远程代码执行,由于是在explorer.exe进程中运行的 ...

  5. sqlserver 触发器语法

    语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER ...

  6. Vue——路由:登录状态的判断

    在搭建的系统中,最基本的登录都是必须的,结合Vue的路由,涉及最多的就是登录状态的判断.也就是说,如果一个组件要校验登录状态,则在用户初始进入时,就要去判断用户是否登录,这里的校验登录状态就是本篇的重 ...

  7. android: requestLayout(), invalidate(), postInvalidate() 方法区别

    一.invalidate和postInvalidate 这两个方法都是在重绘当前控件的时候调用的.invalidate在UI线程中调用,postInvalidate在非UI线程中调用.因为androi ...

  8. js根据数据条数与每页多少条数据计算页数,js前端计算页数

    /**  *根据数据条数与每页多少条数据计算页数   * totalnum 数据条数  * limit 每页多少条  */ function pageCount (totalnum,limit){   ...

  9. AnimatorSet学习示例代码

    package com.loaderman.customviewdemo; import android.animation.AnimatorSet; import android.animation ...

  10. 静态文件cdn自解析生成相对路径

    一.场景和目标:      用户上传一个包含 index.html 的静态资源压缩包,资源内所有文件都是相互依赖的,不需要用户对内部文件内容做任何特殊处理,仅通过服务端逻辑处理达到用户访问 http: ...