题目描述
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最多能到达多少个景点,以及此时最短的滑行距离总和。
输入输出样例
输入样例#1:
3 3
3 2 1
1 2 1
2 3 1
1 3 10
说明
【数据范围】
对于30%的数据,保证 1<=N<=2000
对于100%的数据,保证 1<=N<=100000
对于所有的数据,保证 1<=M<=1000000,1<=Hi<=1000000000,1<=Ki<=1000000000。
这题目的题意真是看不懂
大概意思是给出一张有向图,边的方向是从高到低,让你求一个最小树形图
朱刘算法怒艹1e13也不是不可以啊
这道题的思路确实很妙,没看题解想不到
首先观察发现能到达的点就是一遍BFS,这些点肯定都要到达
然后走过的路径是一个以1为根的最小树形图
直接朱刘算法肯定不行,需要考虑别的办法
这张图的的性质是边只从高连向低,同高度之间是无向边
如果把点按照高度分层,那么有向边只从高的一层连向低的一层,层内只有无向边
这有什么用呢?
我们知道,对于无向图的树形图(即生成树),有很优秀的办法来解决,为什么kruskal和prim不能做有向图的树形图呢?稍微尝试几个例子以后会发现,如果用无向图的方法来做,会有两个问题
1、答案不是最优,这是由于prim的加入顺序问题导致的
2、做出来的根本不是树形图,kruskal没法处理这种情况
但是对于DAG这种特殊的图而言,无向图的方法加上一些魔改就可以做了,对于kruskal而言,把边按照终点的拓扑序为第一关键字,边长为第二关键字排序,然后往里加就行了
让我们回到这道题的图,我们发现这张图很像是一层层的DAG加上层内的无向图,是不是胡搞一下就好了啊?
发现是的,一样这么做就行,第一关键字h降序,第二关键字边长升序,原因是这样既不会产生第一个问题(按顺序一层层加入,答案不会变劣),也不会产生第二个问题(层间不会有问题,层内是无向边,可以随意分配)
然后跑kruskal即可
1 #include
2 #include
3 #include
4 #include
5 #include <string>
6 #include
7 #include
8 #include