思路:

1. 如果根节点是0,那么可以通过一次dfs计算出所有节点的最大值。

2. 如果根节点不是0,那么其余各点的最大值一定是根节点的一个因子。首先计算出根节点的所有因子。在dfs到一个深度为d的节点v时,遍历所有因子:对于因子x,p表示从根节点到达v的路径中能够被x整除的节点个数。如果p >= d - 1,则x就是当前节点的一个候选最大值(d-1是因为可以把路径中其中一个数替换为0)。

于是通过两次dfs即可得出答案。复杂度O(n * sqrt(n))。在dfs的过程中,要注意维护全局变量。dfs到下一个分支时,要把上一个分支对全局变量造成的影响消除。

实现:

 #include <bits/stdc++.h>
using namespace std;
int a[], val[];
vector<int> tree[];
int vis[];
int divisors[]; void dfs(int cur, int div)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
val[tmp] = __gcd(div, a[tmp]);
dfs(tmp, val[tmp]);
}
} void dfs2(int cur, int d, vector<int>& v)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
for (int j = ; j < v.size(); j++)
{
if (a[tmp] % v[j] == ) divisors[j]++;
if (divisors[j] >= d) val[tmp] = max(val[tmp], v[j]);
}
dfs2(tmp, d + , v);
for (int j = ; j < v.size(); j++)
if (a[tmp] % v[j] == ) divisors[j]--;
}
} int main()
{
int n, x, y;
while (cin >> n)
{
for (int i = ; i <= n; i++)
tree[i].clear();
for (int i = ; i <= n; i++)
cin >> a[i];
for (int i = ; i < n - ; i++)
{
cin >> x >> y;
tree[x].push_back(y);
tree[y].push_back(x);
}
int tmp = a[];
a[] = ;
memset(vis, , sizeof vis);
dfs(, );
a[] = val[] = tmp;
vector<int> v;
for (int i = ; i * i <= a[]; i++)
{
if (a[] % i == )
{
v.push_back(i);
if (a[] / i != i) v.push_back(a[] / i);
}
}
sort(v.begin(), v.end());
for (int i = ; i < v.size(); i++) divisors[i] = ;
memset(vis, , sizeof vis);
dfs2(, , v);
for (int i = ; i <= n; i++)
cout << val[i] << " ";
cout << endl;
}
return ;
}

最新文章

  1. jquery mobile
  2. Linux下查看Nginx安装目录、版本号信息?
  3. 工作流软件是未来web的支柱
  4. js正则表达式(常用)
  5. Thinkphp Exception捕获异常失败
  6. Jenkins配置的邮件无法发送的问题
  7. Can&#39;t exec &quot;aclocal&quot;: No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
  8. DirectUI 收集资料
  9. git使用技巧
  10. 架设 OpenLDAP服务器(转)
  11. STM32F103 与 STM32F407引脚兼容问题
  12. 更改Sublimetext3的主题文件,改变某些不喜欢的颜色
  13. CSS3随笔系列之transform(一)—— transform-origin
  14. 关于echarts的使用----模块化单文件引入(推荐) 与标签式单文件引入
  15. POJ 3259 Wormholes( bellmanFord判负环)
  16. svn恢复到之前某个版本号
  17. RocketMQ源码 — 一、 quikstart
  18. hdu1009 FatMouse&#39; Trade---贪心
  19. mysql7笔记----遍历节点所有子节点
  20. arp_spoof脚本的编写

热门文章

  1. 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类
  2. mybatis resultmap标签type属性什么意思
  3. console command
  4. MapReduce获取分片数目
  5. react 项目实战(七)用户编辑与删除
  6. KLT 光流
  7. git基础之创建ssh公钥和密钥
  8. Java语言中extend和implement的区别
  9. asp.net forms认证
  10. Zend Studio如何调试?