【题解】P2573 [SCOI2012]滑雪(最小生成树)

发现了一道比较有思维的题,考虑记一下。

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]

转载于:https://www.cnblogs.com/JCNL666/p/11191573.html

你可能感兴趣的:(【题解】P2573 [SCOI2012]滑雪(最小生成树))