洛谷 题解 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;
}
刘汝佳大法好!
洛谷 题解 UVA1395 【苗条的生成树 Slim Span】的更多相关文章
- 洛谷 UVA1395 苗条的生成树 Slim Span
题目链接 题目描述 求所有生成树中最大边权与最小边权差最小的,输出它们的差值. 题目分析 要求所有生成树中边权极差最小值,起初令人无从下手.但既然要求所有生成树中边权极差最小值,我们自然需要对每一棵生 ...
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...
- 洛谷P4234 最小差值生成树(LCT,生成树)
洛谷题目传送门 和魔法森林有点像,都是动态维护最小生成树(可参考一下Blog的LCT总结相关部分) 至于从小到大还是从大到小当然无所谓啦,我是从小到大排序,每次枚举边,还没连通就连,已连通就替换环上最 ...
- 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)
必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 苗条的生成树 Slim Span--洛谷
传送门 钢哥终于没给黑题紫题了(卑微v 稍稍需要多想一点点 ---------------------------------------------------------------------- ...
- 【刷题】洛谷 P4234 最小差值生成树
题目描述 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 \(n, m\) ,表示图的 ...
- 洛谷P4234 最小差值生成树(lct动态维护最小生成树)
题目描述 给定一个标号为从 11 到 nn 的.有 mm 条边的无向图,求边权最大值与最小值的差值最小的生成树. 输入输出格式 输入格式: 第一行两个数 n, mn,m ,表示图的点和边的数量. ...
- [洛谷P4234] 最小差值生成树
题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:求一棵生成树,其最大边权减最小边权最小 解题思路 和魔法森林非常像.先对所有边进行排序,每次加边的时候删除环上的最小 ...
随机推荐
- P5431 【模板】乘法逆元2
洛谷题目链接 刚开始做乘法逆元还是有点懵逼的~ 以下式子都在模\(p\)意义下进行 我们把式子改一下,变成:\[\sum\limits_{i=1}^nk^i\times a_i^{-1}\] 我们先算 ...
- P3410 拍照
漂亮小姐姐点击就送:https://www.luogu.org/problemnew/show/P3410 题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一 ...
- 爬虫(十四):scrapy下载中间件
下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...
- ftp连接
package enterprise.celerity.ac.util; import java.io.IOException;import java.io.InputStream;import ja ...
- BZOJ1856[Scoi2010]字符串——组合数学+容斥
题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...
- Qt 的插件制作
首先会遇到一些插件使用的问题: 插件加载的时候出现乱码 qrc:/main.qml:20: Error: Qt.createQmlObject(): failed to create object: ...
- 基于Python的GMSSL实现
基于Python的GMSSL实现 团队任务 一.小组讨论对课程设计任务的理解 基于Python的GMSSL实现,即GmSSL开源加密包的python实现,支持其SM2/SM3/SM4等国密(国家商用密 ...
- java之map遍历
java开发中常常会用到遍历,所以下边就列举四种map的遍历方法. public class testMap { public static void main(String[] args) { Ma ...
- PHP try catch 如何使用
<?php try { if (file_exists('test_try_catch.php')) { require ('test_try_catch.php'); } else { ...
- 遇到多个构造器参数时要考虑用构建器 builder 模式 JavaBean 线程安全
effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.