bzoj2753】的更多相关文章

首先显然可以把所有能到的点拎出来建个新图,这样第一问也就做好了. 剩下的部分似乎是一个裸的最小树形图.但显然这个东西是没什么学的必要的并且不太能跑过去. 考虑建出来的图有什么性质.可以发现如果没有高度相等的点这就是个DAG.DAG的最小树形图只需要每个点选一条最短入边即可,最优性显然.或者说是将边从小到大排序后若合法则选入. 然后考虑高度相等的点.如果某条边的两端点已经通过入边连在一起,两个点就相当于已连通,若加入该边则形成环:而如果通过出边连在一起,仍然是未连通的. 那么按照终点高度为第一关键…
BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点.如果仅仅访问一条路径上的景点,他会觉得数量太少.于是a180285拿出了他随身携带的…
题目链接 BZOJ2753 题解 完了我连\(kruskal\)裸题都做不出来了.. 题目是求最小树形图,即有向图最小生成树 我们不能直接上\(kruskal\),而要保证先加入前面的点, 所以我们排序的时候第一关键字改为高度即可 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map>…
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2282  Solved: 796 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a1802…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2753 分析: 第一问:直接BFS扩展知道无法扩展 第二问: 看似就是最小树形图啊= =但是数据范围太大了……猪牛算法是O(mn),肯定TLE的. 于是考虑一下用最小生成树的想法 当然单纯的用Kruskal,是不可以的,问题处在哪里呢?因为如果按边权排序从小到大那么边的方向不确定,故最后形成的图中可能有边的方向反了导致不是一个树形图. 所以可以想到边的终点的点对应的高度大小肯定优先于边…
第一问dfs不说 第二问很容易让人想到最小树形图,但是我不会,而且时间复杂度也不允许 还有什么不同的方法呢? 首先想到的是prim的思想,设根节点已经确定,其他点未确定 我们就不断从已确定的点延伸,找到到未确定点中高度最高的那个点的最短边距(如果有多个高度相同的点,肯定选边距最短的) 将边距加入ans,并将这个点标为确定,重复上述,知道所有点都确定即可. 这样的算法没有问题,但是复杂度好像仍然不能AC 我们想,既然我们能用类似prim的思想,为什么不用Kruska呢? Kruskal的问题在于,…
Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2843  Solved: 993[Submit][Status][Discuss] Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180…
传送门 最小生成树菜题. 题意:给出一些有向边,问有向的最小生成树. 思路:先dfsdfsdfs一把所有有用的边都存起来,然后按终点点权为第一关键字,边权为第二关键字给边排序保证最小生成树的合法性,排完之后跑kruskalkruskalkruskal就行了. 代码: #include<bits/stdc++.h> #define ri register int #define fi first #define se second using namespace std; inline int…
第一问直接把可以走的边连起来bfs一遍即可 第二问可以用类似kruskal的方法,只不过排序的依据应该变为第一关键字为终点高度(从大到小),第二关键字为边权(从小到大),只排序可以走的边 因为同样高度的点之间的边是双向边,所以同一个高度的所有点构成了一个强连通分量,考虑终点在这个强连通分量的所有边,要么是在这个强连通分量中,要么是从更高处过来的边,我们处理这两种边都可以把它们当成无向边,也就是直接套用kruskal #include<stdio.h> #include<algorithm…
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; typedef long long LL; #define N 1000010 struct edge { LL to,next; }e…