列表

详情


NC13233. 最长树链

描述

树链是指树里的一条路径。美团外卖的形象代言人袋鼠先生最近在研究一个特殊的最长树链问题。现在树中的每个点都有一个正整数值,他想在树中找出最长的树链,使得这条树链上所有对应点的值的最大公约数大于1。请求出这条树链的长度。

输入描述

第1行:整数n(1 ≤ n ≤ 100000),表示点的个数。 第2~n行:每行两个整数x,y表示xy之间有边,数据保证给出的是一棵树。 第n+1行:n个整数,依次表示点1~n对应的权值(1 ≤ 权值 ≤ 1,000,000,000)。

输出描述

满足最长路径的长度

示例1

输入:

4
1 2
1 3
2 4
6 4 5 2

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 76ms, 内存消耗: 10488K, 提交时间: 2021-01-14 10:11:52

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N=100000+100;
int n,x,y,ans;
int a[N],f[N];
vector<int>v[N];
void dfs(int u,int len,int w)
{
	for(auto x:v[u])
	{
		int gc=__gcd(a[x],w);
		if(gc==1)dfs(x,1,a[x]);
		else dfs(x,len+1,gc);
	}
	ans=max(ans,len);
}
signed main()
{
	scanf("%lld",&n);
	for(int i=0;i<n-1;i++)
	{
		scanf("%lld%lld",&x,&y);
		v[x].push_back(y);
		f[y]=1;
	}
	int root=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		if(!f[i]&&!root)root=i;
	}
	dfs(root,1,a[root]);
	printf("%lld\n",ans);
	return 0;
}

上一题