洛谷 题解 UVA1395 【苗条的生成树 Slim Span】
【题意】
给出一个\(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】相关推荐
- 洛谷 UVA1395 苗条的生成树 Slim Span
题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...
- 洛谷P5633 最小度限制生成树 题解
洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷题解——P2814 家谱
题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P2814. MYOJ,http://47.110.135.197/problem.php?id=5344. ...
- 【洛谷题解】P2433 【深基1-2】小学数学 N 合一
目录 [深基1-2]小学数学 N 合一 题解 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 题目解析 问题 1~5 问题 6~10 问题 10~14 发牢骚 完整代码 谢谢 ...
- 洛谷题解——P1621 集合
题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P1621. MYOJ,http://47.110.135.197/problem.php?id=5342. ...
- 洛谷题解——P1873:砍树
视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...
- 洛谷题解——P1024:一元三次方程求解
视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1qT4y13717/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...
- 题解系列009 | 洛谷题解 CF488A 【Giga Tower】
原题传送门:Giga Tower 一.题意 题目(传送门)给一个绝对值不超过十位的整数,想计算至多加几后会在和数中出现数字 888. 二.分析 看到这道题,我们最容易想到的当然是暴力枚举,但是首先需要 ...
- 洛谷.4234.最小差值生成树(LCT)
题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...
最新文章
- 【工具】TFT彩屏图片点阵取模工具,Img2Lcd图片取模软件,图片生成c语言头文件...
- java sql参数_java-从SQL查询检索参数
- Windows、Linux系统安装JDK配置Java环境变量
- Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化
- 通用ShellCode深入剖析
- mysql 1054 42s22_MySQL 触发器的坑:ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'
- 第一个spring冲刺团队贡献分(80分满分)
- Docker生产环境配置——设置direct-lvm模式
- linux内存测试工具memtest,Linux基础教程:内存测试工具(Memtest86+)
- 2021牛客多校#10 F-Train Wreck
- 华为ensp配置AC+AP多个SSID信号
- 浪潮存储加速国产替代
- 计算机网络在资源共享信息交换的体会,计算机网络学习心得体会.doc
- linux 环境下安装dubbo管理控制台 dubbo admin
- 软考下午常见问题——个人笔记
- 计算机毕业设计Java城市出行行程智能推荐系统(源码+系统+mysql数据库+lw文档)
- Linux下的CPU性能瓶颈分析案例
- EAN13条形码了解,有c测试代码
- Galgames Hgames下载中心,无毒
- 头像上传(限制大小,格式,尺寸)
热门文章
- H3C WAC360 基于Win2012 NPS 802.1x 认证
- [HihoCoder1369]网络流一·Ford-Fulkerson算法
- fastjson SerializerFeature
- 0.python class
- JAX-RS (REST Web Services) 2.0 requires Java 1.7 o
- Servlet和JSP学习指南
- Windows服务器系统的端口要求
- KE之undefinded instruction问题记录
- linux下测试磁盘的读写IO速度(IO物理测速)
- Linux内核部件分析 更强的链表klist