下午花了三个小时肝这道题,心态差点爆炸!

下面是分析:

 1 题目要求:
2 求最小生成树
3 但是
4 - a是从1号点开始的 --> 如果以后的某个点比一号高,则不可能到达
5 - a只能从高往低处滑
6 - 可能某两个景点没有轨道连接 -->没有处在一个联通快里?
7
8 生成树的要求:
9 - 树根高度最大
10 - 子节点的高度必须比父亲结点小
11 - 边权和尽可能小
12
13 自己造的样例:
14 输入:
15 4 4
16 4 2 3 1
17 1 2 3
18 2 3 2
19 2 4 4
20 3 4 1
21
22 输出:
23 3 7

从题解上爬的Solotion:

 1 为保证我们只会由高到低,我们就只建立由高向低的单向边即可。
2
3 对于建立出来的图A,由1点开始宽搜,将扩展到的点和边加入一个新图B,
4 所有扩展到的点便是能到达的最多点。
5
6 我们再在这个新图上跑Kruskal求最小生成树,求得最短距离。
7
8 对于排序部分,为保证有尽可能多的点在最小生成树里,
9 我们按终点的高度为第一关键字从大到小排序,边长为第二关键字从小到大排序;
10
11 这样就能保证拓展的点最多,进而再用最小生成树求最短距离。

最终AC代码:

 1 /*
2 Work By:Suzt_ilymtics
3 */
4 #include<iostream>
5 #include<cstdio>
6 #include<algorithm>
7 #include<queue>
8 using namespace std;
9 const int MAXN=1e5+5;
10 const int MAXM=1e6+6;
11 struct edge{
12 int from,to,nxt;
13 long long w;
14 }e_a[MAXM << 1],e_b[MAXM << 1];
15 int head_a[MAXN],num_edge_a;
16 int num_edge_b;
17 int n,m,cnt;
18 long long ans;
19 int h[MAXN],f[MAXN];
20 bool vis[MAXN];
21 queue<int> q;
22
23 int find(int x) {return f[x] == x ? x : f[x]=find(f[x]);}
24
25 bool cmp(edge x,edge y){return h[x.to] == h[y.to] ? x.w < y.w : h[x.to] > h[y.to];}
26
27 void add_a(int from,int to,int w){
28 e_a[++num_edge_a].from = from;
29 e_a[num_edge_a].to = to;
30 e_a[num_edge_a].w = w;
31 e_a[num_edge_a].nxt = head_a[from];
32 head_a[from] = num_edge_a;
33 }
34
35 void add_b(int from,int to,int w){
36 e_b[++num_edge_b].from = from;
37 e_b[num_edge_b].to = to;
38 e_b[num_edge_b].w = w;
39 }
40
41 void bfs(int x){
42 q.push(x);vis[1]=1;
43 while(!q.empty()){
44 int t=q.front(); q.pop();
45 for(int i=head_a[t];i;i=e_a[i].nxt){
46 add_b(e_a[i].from,e_a[i].to,e_a[i].w);
47 if(!vis[e_a[i].to]){
48 vis[e_a[i].to]=1;
49 q.push(e_a[i].to);
50 cnt++;
51 }
52 }
53 }
54 }
55
56 void kls(){
57 for(int i=1;i<=num_edge_b;++i){
58 int uf=find(e_b[i].from),vf=find(e_b[i].to);
59 if( uf == vf ) continue;
60 else{
61 f[uf] = vf;
62 ans+=e_b[i].w;
63 }
64 }
65 }
66
67 int main()
68 {
69 scanf("%d%d",&n,&m);
70 for(int i=1;i<=n;++i){
71 scanf("%d",&h[i]),f[i]=i;
72 }
73 for(int i=1,u,v,w;i<=m;++i){
74 scanf("%d%d%d",&u,&v,&w);
75 if(h[u]>=h[v]) add_a(u,v,w);
76 if(h[u]<=h[v]) add_a(v,u,w);
77 }
78 bfs(1);
79 sort(e_b+1,e_b+num_edge_b+1,cmp);
80 kls();
81 printf("%d %lld",cnt+1,ans);
82 return 0;
83 }

 The end

(这篇文章终于能看了点)

P2573 [SCOI2012]滑雪 题解的更多相关文章

  1. P2573 [SCOI2012]滑雪

    题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着 M 条供滑行的轨道和 N 个轨道之间的交点(同时也是景点),而且每个景点都有一编号 i ( 1≤i≤N )和一高度 Hi.a18028 ...

  2. BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树

    题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...

  3. Bzoj2753 [SCOI2012]滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2282  Solved: 796 Descriptio ...

  4. Code[VS] 2152 滑雪题解

    Code[VS] 2152 滑雪题解 题目描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行 ...

  5. bzoj 2753: [SCOI2012]滑雪与时间胶囊 -- 最小生成树

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MB Description a180285非常喜欢滑雪.他来到一座雪山,这 ...

  6. 【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2457  Solved: 859 Descriptio ...

  7. BZOJ2753 SCOI2012 滑雪与时间胶囊 【最小生成树】*

    BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有 ...

  8. 2753: [SCOI2012]滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 910 Descriptio ...

  9. bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST

    题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285 ...

随机推荐

  1. bean中属性名和json不一致解决方案(请求和响应)

    此时@RequestBody.@ResponseBody需要与@JsonProperty结合使用,才能做到请求正常解析,响应按要求格式返回. 注意@JsonProperty注解的位置需要加在gette ...

  2. Centos7 搭建openldap完整详细教程(真实可用)

    最近,由于公司需求,需要搭建openldap来统一用户名和密码,目前市面上几乎所有的工具都支持ldap协议,具体ldap的介绍这里就不详细说明了,这里主要记录一下如果部署openldap来实现Ldap ...

  3. Spring AOP 实战运用

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  4. 详解Js加法运算符

    简介 JavaScript是一门了不起的语言.我喜欢它的灵活性:只需以你喜欢的方式做事:更改变量类型,动态的向对象添加方法或属性,对不同的变量类型使用运算符等等. 然而动态是要付出代价的,开发人员需要 ...

  5. 在 Emit 代码中如何await一个异步方法

    0. 前言 首先立马解释一波为啥会有这样一篇伪标题的Demo随笔呢? 不是本人有知识误区,或者要误人子弟 因为大家都知道emit写出来的都是同步方法,不可能await,至少现在这么多年来没有提供对应的 ...

  6. 【Go】四舍五入在go语言中为何如此困难

    四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法. 而在 Go 语言中这似乎成为了难题,在 stackoverflow ...

  7. Centos7 编译安装PHP7.2

    yum install wget 在 /usr/local/src 目录下载php源码包 wget http://cn2.php.net/distributions/php-7.2.4.tar.gz ...

  8. Pytest测试框架(五):pytest + allure生成测试报告

    Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...

  9. Redis守护进程作用+数据类型

    Redis开启守护进程的作用: 在 linux 中,每一个系统与用户进行交流的界面称为终端 如果没有开启守护进程,相当于知识在前台开启了Redis,当终端关闭时,Reids服务也会跟着关闭 而开启守护 ...

  10. String -- 从源码剖析String类

    几乎所有的 Java 面试都是以 String 开始的,String 源码属于所有源码中最基础.最简单的一个,对 String 源码的理解也反应了你的 Java 基础功底. String 是如何实现的 ...