发现了一道比较有思维的题,考虑记一下。
Desciption
给出 \(n\) 个点,每个点有一个高度,同时给出 \(m\) 条滑道。连接两个点,可以从高度高的点到高度低的点,滑道距离会给出。
求出能到达的所有点的最小滑道距离和。
Solution
我们考虑一下,对于滑道我们可以建边,但是要注意。只能从高向低连边,同时相同高度的点之间得连双向边。
讲道理,我们发现这题说什么到所有可以到达的点的什么距离和,一看就是最小生成树。
那么我们考虑对于这么一张图我们先bfs出所有可以到达的点,然后再对他进行最小生成树。
但是有可能有些边是单向的我们怎么办?
其实有一个很神奇的想法,我们可以按照高度为第一关键字排个序,然后发现在高度低的之前,高度高的一定已经考虑过了,那么一定可以到达那些低的点。
具体怎么理解呢?
我们考虑这样建模,高度相同的点放在同一层,然后每次在一层做完最小生成树,通过连向下一层的边把答案继承到下一层。
具体实现的话可以通过对边连出的点的高度排序。
代码来了~~
#include
using namespace std;
#define int long long
int En;
typedef pair PII;
const int N=1e5+5,M=1e6+5;
int head[N],height[N],fa[N],vis[N];
queue q;
vector G[N];
struct edge {
int x,y,w;
bool operator < (const edge &nt) const {
if(height[y]!=height[nt.y]) return height[y]>height[nt.y];
return wheight[v])
G[u].push_back(make_pair(v,w));
if(height[u]