【JZOJ 3806】小X 的道路修建
Description
因为一场不小的地震,Y 省n 个城市之间的道路都损坏掉了,省长希望小X 将城市之间的道路重修一遍。
很多城市之间的地基都被地震破坏导致不能修路了,因此可供修建的道路只有m 条。因为施工队伍有限,省长要求用尽量少的道路将所有的城市连通起来,这样施工量就可以尽量少。不过,省长为了表示自己的公正无私,要求在满足上述条件的情况下,选择一种方案,使得该方案中最贵道路的价格和最便宜道路的价格的差值尽量小,即使这样的方案会使总价提升很多也没关系。
小X 现在手忙脚乱,希望你帮帮他。
2 ≤ n ≤ 2000,0 ≤ m ≤ 15000
Solution
发现O(nm)O(nm)可以过耶!
先把边按大小排个序,
对于每条边,扫一遍全局,看看有没有环,有的话把环上最小的边去掉,
每次判断一下是不是联通的,是则更新答案,
复杂度:O(nm+mlog(m))O(nm+m\log(m))
Code
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define efo(i,q) for(int i=A[q];i;i=B[i][0])
#define min(q,w) ((q)<(w)?(q):(w))
#define max(q,w) ((q)>(w)?(q):(w))
using namespace std;
const int N=2005;
int read(int &n)
{char ch=' ';int q=0,w=1;for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());if(ch=='-')w=-1,ch=getchar();for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
int n,m,ans,FD;
struct qqww
{int x,y,v;
}b[N*8];
bool z[N*8];
int B[N*16][5],A[N],B0=1;
bool PX(qqww q,qqww w){return q.v<w.v;}
void DLT(int q)
{if(B[q][3])B[B[q][3]][0]=B[q][0];else A[B[q^1][1]]=B[q][0];B[B[q][0]][3]=B[q][3];
}
void link(int q,int w,int e,int e1)
{B[++B0][0]=A[q],B[A[q]][3]=B0,A[q]=B0,B[B0][1]=w,B[B0][2]=e,B[B0][4]=e1;B[++B0][0]=A[w],B[A[w]][3]=B0,A[w]=B0,B[B0][1]=q,B[B0][2]=e,B[B0][4]=e1;
}
void dfs(int q,int fa,int zd,int mi)
{if(q==zd){FD=mi;return;}efo(i,q)if(B[i][1]!=fa){if(B[i][2]>B[mi][2])dfs(B[i][1],q,zd,mi);else dfs(B[i][1],q,zd,i);if(FD)return;}
}
int main()
{int q,w,e;read(n),read(m);fo(i,1,m)read(b[i].x),read(b[i].y),read(b[i].v);sort(b+1,b+1+m,PX);ans=2e9;int mi=1,x,y;q=0;B[0][2]=1e9;fo(i,1,m){int x=b[i].x,y=b[i].y;FD=0;dfs(x,0,y,0);if(!FD)q++;else {z[B[FD][4]]=1;DLT(FD),DLT(FD^1);}link(x,y,b[i].v,i);while(z[mi])mi++;if(q==n-1)ans=min(ans,b[i].v-b[mi].v);}if(ans==2e9)printf("-1\n");else printf("%d\n",ans);return 0;
}
【JZOJ 3806】小X 的道路修建相关推荐
- JZOJ 3806. 【NOIP2014模拟8.24】小X 的道路修建
Description 因为一场不小的地震,Y 省n 个城市之间的道路都损坏掉了,省长希望小X 将城市之间的道路重修一遍. 很多城市之间的地基都被地震破坏导致不能修路了,因此可供修建的道路只有m 条. ...
- Jzoj3806 小X 的道路修建
给你一个图,求一个最大边和最小边差值最小的生成树 首先我们可以枚举最小边,每次跑一个最小生成树即可 但是这样会超时,我们考虑优化 采用最优性剪枝,假设我们当前树中的最小边是i,当前边是j,当前最优答案 ...
- P4878 道路修建-美国
http://www.tyvj.cn/p/4878道路修建 我想我经大神点拨后终于明白了...回学校再写吧 时间限制:1s 内存限制:256MB [问题描述] A国是一个商业高度发达的国家.它包含了n ...
- 2435: [Noi2011]道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2188 Solved: 639 [Submit][Stat ...
- bzoj 2435: [Noi2011]道路修建 树上 dp
2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 【bzoj 2435】[Noi2011]道路修建(dfs)
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3505 Solved: 1167 [Submit][Sta ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3115 Solved: 1002 [Submit][Sta ...
- bzoj 2435: [Noi2011]道路修建(DFS)
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4110 Solved: 1429 [Submit][Sta ...
- tyvj4878 道路修建 双连通分量+单调队列
Description A国是一个商业高度发达的国家.它包含了n座城市,每座城商业都很发达.但不幸的是,A国的交通并没有像其商业那么发达,它仅仅保证了任意两座城市之间有路径存在,而且只存在唯一的一条! ...
最新文章
- visual studio asmx 调试_通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序...
- 智能体到底是什么?这里有一篇详细解读
- 将中缀表达式转化为后缀表达式
- sklearn做交叉验证
- Android 获取SD卡的图片资源
- 安装windows 2003 R2额外域控制器时出现1168错误的解决
- c语言通用Makefile
- linux 4.4内核是什么,Linux 内核 4.4 LTS 将于2016年1月10日发布
- 提取一个二进制位最右侧的1
- Hibernate各种主键生成策略与配置详解
- 取pi的前8位的解压密码_两种方式实现取16位变量的高低8位, 不严谨对比
- Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
- vue element-ui只有一条信息时默认选中按钮,且不能取消,多条信息时可以手动选择
- CentOS7学习笔记--PHP环境安装
- 在线php网站扫描,php实现在线端口扫描实例代码_PHP教程
- 《出发吧一起》第二阶段个人总结——Day08
- linux ftdi 虚拟,linux – 由FTDI USB串行转换器创建的监控(嗅探)/ dev / ttyUSB0
- python编程设计圆柱_《学习PYTHON—做个有编程能力的设计师》怎么样_目录_pdf在线阅读 - 课课家教育...
- NVIDIA Nsight Systems 入门及使用
- 微信棋牌H5游戏开发教程以及如何有效防止被人恶意攻击
热门文章
- maya软件需要计算机配置,【答疑】Maya软件对电脑的配置要求 - 视频教程线上学...
- ETCD 源码学习--lease(一)
- leetcode 分tag
- uos系统中windows格utf8编码文件转GBK
- 当前主流电脑的BIOS调出键
- 【聆思CSK6 视觉AI开发套件试用】基于CSK6011a_nano的虚拟打砖块交互系统
- python trutle画五星红旗
- Vs2005报表设计器XML分析总结 作者:长江支流
- Docker更换容器存储路径Root-dir
- linux红帽给文件加密,红帽大神制作 Linux 工具,用于旧款罗技无线键盘加密设置...