BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树
题目链接:
题目
2753: [SCOI2012]滑雪与时间胶囊
Time Limit: 50 Sec
Memory Limit: 128 MB
问题描述
a180285非常喜欢滑雪。他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi。a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j。 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点。如果仅仅访问一条路径上的景点,他会觉得数量太少。于是a180285拿出了他随身携带的时间胶囊。这是一种很神奇的药物,吃下之后可以立即回到上个经过的景点(不用移动也不被认为是a180285 滑行的距离)。请注意,这种神奇的药物是可以连续食用的,即能够回到较长时间之前到过的景点(比如上上个经过的景点和上上上个经过的景点)。 现在,a180285站在1号景点望着山下的目标,心潮澎湃。他十分想知道在不考虑时间
胶囊消耗的情况下,以最短滑行距离滑到尽量多的景点的方案(即满足经过景点数最大的前提下使得滑行总距离最小)。你能帮他求出最短距离和景点数吗?
输入
输入的第一行是两个整数N,M。
接下来1行有N个整数Hi,分别表示每个景点的高度。
接下来M行,表示各个景点之间轨道分布的情况。每行3个整数,Ui,Vi,Ki。表示
编号为Ui的景点和编号为Vi的景点之间有一条长度为Ki的轨道。
输出
输出一行,表示a180285最多能到达多少个景点,以及此时最短的滑行距离总和。
样例
input
3 3
3 2 1
1 2 1
2 3 1
1 3 10
output
3 2
Hint
【数据范围】
对于30%的数据,保证 1<=N<=2000
对于100%的数据,保证 1<=N<=100000
对于所有的数据,保证 1<=M<=1000000,1<=Hi<=1000000000,1<=Ki<=1000000000。
题解
首先dfs一下,找到所有可达的点。
然后发现是个最小树形图的问题,但是朱刘算法会跑超时!
观察一下这道题的特殊性!
我们按照海拔来分类,先讨论比较高的点再讨论比较低的点,你会发现同一个海拔的点之间连得都是双向边,所以同一个海拔的点是可以用kruskal跑最小生成树的。
我们考虑两个相同海拔的连通,只能通过祖先或是同海拔的点,如果它们是通过后代来连通的话,那么它们之间必定是不连通的(有向边所导致的)所以我们对每条边先按终点的海拔降序排列,对相同的海拔按距离升序排序。然后跑kruskal最小生成树。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5 + 10;
const int maxm = 2e6 + 10;
typedef long long LL;
int n,m;
int fa[maxn], hi[maxn];
int find(int x) {
return fa[x] = fa[x] == x ? x : find(fa[x]);
}
struct Edge {
int u, v, w;
Edge(int u, int v, int w) :u(u), v(v), w(w) {}
bool operator < (const Edge& tmp) const {
return hi[v]>hi[tmp.v] || hi[v] == hi[tmp.v] && w < tmp.w;
}
};
vector<int> G[maxn];
vector<Edge> egs, egs2;
void addEdge(int u, int v, int w) {
egs.push_back(Edge(u, v, w));
G[u].push_back(egs.size() - 1);
}
int vis[maxn];
void dfs(int u) {
for (int i = 0; i < G[u].size(); i++) {
Edge e = egs[G[u][i]];
egs2.push_back(e);
if (!vis[e.v]) {
vis[e.v] = 1;
dfs(e.v);
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &hi[i]);
while (m--) {
int u, v,w;
scanf("%d%d%d", &u, &v,&w);
if (hi[u] < hi[v]) swap(u, v);
addEdge(u, v, w);
if (hi[u] == hi[v]) addEdge(v, u, w);
}
memset(vis, 0, sizeof(vis));
vis[1] = 1;
dfs(1);
sort(egs2.begin(), egs2.end());
for (int i = 1; i <= n; i++) fa[i] = i;
LL ans = 0; int cnt = 0;
for (int i = 0; i < egs2.size(); i++) {
Edge& e = egs2[i];
int pu = find(e.u);
int pv = find(e.v);
if (pu != pv) {
ans += e.w;
cnt++;
fa[pv] = pu;
}
}
printf("%d %lld\n", cnt + 1, ans);
return 0;
}
BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树的更多相关文章
- bzoj 2753: [SCOI2012]滑雪与时间胶囊 -- 最小生成树
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Description a180285非常喜欢滑雪.他来到一座雪山,这 ...
- bzoj 2753: [SCOI2012]滑雪与时间胶囊
Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi. ...
- 【刷题】BZOJ 2753 [SCOI2012]滑雪与时间胶囊
Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi. ...
- bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST
题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285 ...
- 【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2457 Solved: 859 Descriptio ...
- 2753: [SCOI2012]滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 910 Descriptio ...
- 【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description ...
- bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2843 Solved: 993[Submit][Status][Discuss] Descripti ...
- Bzoj2753 [SCOI2012]滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2282 Solved: 796 Descriptio ...
随机推荐
- rs.open 打开数据库权限问题 rs.open sql,conn,1,3 等后缀权限问题
Rs.open sql,conn,[0~3],[1~4] 这两个是游标,具体的作用是:RS.OPEN SQL,CONN,A,BA:ADOPENFORWARDONLY(=0)只读,且当前数据记录只能向下 ...
- win7安装office2007出错被中断-已经解决
觉得雨林木风win7系统本身的office2007不好,但不能卸载,用360强力删除工具,把整个安装的文件夹全部删除,重新用之前能够在另外xp和win7系统成功安装的破解版office2007,安装开 ...
- 找不到命名空间命名空间:System.Windows.Forms
System.Windows.Forms在system.windows.forms.dll中.需要添加引用.在解决方案资源管理器中的引用上单击右键,选择添加引用.找到System.windows.fo ...
- Objective-C 【protocol-协议 的了解使用】
------------------------------------------- protocol(协议) (1)引文:OC中的protocol和Java中的接口(interface)比较类似, ...
- python简单爬虫编写
1.主要学习这程序的编写思路 a.读取解释网站 b.找到相关页 c.找到图片链接的元素 d.保存图片到文件夹 ..... 将每一个步骤都分解出来,然后用函数去实现,代码易读性高. ##代码尽快运行时会 ...
- maxlength属性在textarea里奇怪的表现
HTML5给表单带来了很多改变,比如今天要说的maxlength,这个属性可以限制输入框输入的最大字字符数,更方便的是对于粘贴的内容也能够根据字符数自动截断. 最近就接到这要一个需求,限制用户最多输入 ...
- 济南学习 Day2 T2 am
[问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有
- C指针赋值
Node* p = A; Node* f = B; Node* t; t = p; t = f 本人试图让p指向B,但这样操作是不行的.如下图:只是改变了t的指向,p并没有变
- Boost库实现线程池学习及线程实现的异步调用
A.Boost线程池实现 参考自: Boost库实现线程池实例 原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行:使用队列存储待 ...
- jQuery滚动监听插件Waypoints
页面内滚动操作的导航插件Waypoints.它可以让你方便的处理页面滚动事件,你可以比较自由的在自己的UI中使用这个插件控制页面滚动事件. Waypoints根据用户滚动的位置来帮助开发者构建相关的设 ...