题意:
给一张图,定义一条路径的长度为这条路径上的边权最大的边的边权。
定义两点间距离为这两点间路径的最小长度。
给出k个特殊节点,求对于每个特殊节点,距离它最远的点到它的距离。
思路:
可以知道,这个距离一定出现在最小生成树上。
所以先跑一遍kruskal,然后取第一个特殊节点dfs求出每个特殊节点到它的距离d[i],所有节点的最远距离都是 max (d[i])。
题解:
我们可以发现答案一定是最小生成树上的一条边,而且所有xi 的答案都相同(任何一个在这条边一侧的特殊点都可以选择在这条边的另一侧的特殊点作为离自己距离最远的特殊点),那么只有当选取的边的两侧都有特殊点的时候他才可以被算作答案。
我们就可以在计算最小生成树合并点集的时候记录一下一个点集中是否有特殊点来判断这个边是否需要用于更新答案。最后把答案输出k 次就行了。
vector 写法
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1.5e6+5;
const int MAXM = 1.5e6+5;
typedef long long ll;
std::vector<int> v[MAXM];
int sum[MAXM];
struct Edge
{
int x , y , z;
Edge(int xx , int yy , int zz){
x = xx, y = yy , z = zz;
}
Edge(){
}
bool operator < (const Edge