题目链接: 最长树链
大致题意:
这个题应该默认树链的一段必须是根节点
解题思路:
建立单向边,找到根开始dfs,如果对于某个结点使得gcd值大于1就将其加入树链,记录深度的最大值最后输出即可
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, root;
vector<int>e[N];
int w[N], du[N];
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int dfs(int u, int ans, int val) {
int res = 0; res = max(res, ans);
for (auto& v : e[u]) {
int x = gcd(val, w[v]);
if (x == 1)continue;
else res = max(res, dfs(v, ans + 1, x));
}
return res;
}
int main() {
cin >> n;
for (int i = 1; i < n; ++i) {
int a, b; cin >> a >> b;
e[a].push_back(b); du[b]++;
}
for (int i = 1; i <= n; ++i) cin >> w[i];
for (int i = 1; i <= n; ++i)
if (!du[i]) {
root = i;
break;
}
cout << dfs(root, 1, w[root]) << endl;
return 0;
}