mootube解析
题目
题目描述
在业余时间,Farmer John 创建了一个新的视频共享服务,他将其命名为 MooTube。在 MooTube 上,Farmer John 的奶牛可以录制,分享和发现许多有趣的视频。他的奶牛已经发布了 N个视频,为了方便将其编号为 1…N。然而,FJ 无法弄清楚如何帮助他的奶牛找到他们可能喜欢的新视频。
FJ 希望为每个 MooTube 视频创建一个“推荐视频”列表。这样,奶牛将被推荐与他们已经观看过的视频最相关的视频。
FJ 设计了一个“相关性”度量标准,顾名思义,它确定了两个视频相互之间的相关性。他选择 N−1 对视频并手动计算其之间的相关性。然后,FJ 将他的视频建成一棵树,其中每个视频是节点,并且他手动将 N−1 对视频连接。为了方便,FJ 选择了 N−1 对,这样任意视频都可以通过一条连通路径到达任意其他视频。 FJ 决定将任意一对视频的相关性定义为沿此路径的任何连接的最小相关性。
Farmer John 想要选择一个 K值,以便在任何给定的 MooTube 视频旁边,推荐所有其他与该视频至少有 K相关的视频。然而,FJ 担心会向他的奶牛推荐太多的视频,这可能会分散他们对产奶的注意力!因此,他想设定适当的 K值。 Farmer John希望得到您的帮助,回答有关 K值的推荐视频的一些问题。
解法
解法1:
DFS
#include <bits/stdc++.h>
using namespace std;
struct edge {
int a, b, w;
};
struct query {
int v, w, id;
};
int f[100001], sum[100001];
edge edges[100001];
query queries[100001];
int ans[100001];
int find(int a) {
//防伪删除
//此处是找到最近的节点
}
void merge(int x, int y) {
//防伪删除
//利用find改变f与sum
}
bool cmpEdge(const edge &a, const edge &b) {
return a.w > b.w;
}
bool cmpQuery(const query &a, const query