IT评测·应用市场-qidao123.com

标题: 算法 之 树形dp 树的中央、重心 [打印本页]

作者: 滴水恩情    时间: 2025-3-11 21:59
标题: 算法 之 树形dp 树的中央、重心
求解树的重心





  1. int dfs(int u)
  2. {
  3.         vis[u] = true; //为了不重复搜索,所以得标记
  4.         int size = 0; // 记录u的子树中的最大节点数
  5.         int sum = 1; // 记录以u为根节点的子树的节点总数
  6.         for(int i = h[u];i!=-1;i=ne[i])
  7.         {
  8.                 int j = e[i];
  9.                 if (vis[j]) continue;
  10.                 int s = dfs(j);
  11.                 size = max(size,s);
  12.                 sum += s;
  13.         }
  14.         ans = min(ans,max(size,n-sum));
  15.         return sum;
  16. }
复制代码

  1. # 使用邻接表来存储点之间的边关系
  2. g = [[]*n ]
  3. vis = [False]*n
  4. ans = n
  5. def dfs(u):
  6.         global ans
  7.         vis[u] = True
  8.         sumnum = 1 # 记录以u为根节点的子树的总节点数
  9.         size = 0 # 记录 u的子树当中最大的节点数
  10.         for v in g[u]:
  11.                 if vis[v]: continue # 如果访问过就跳过
  12.                 s = dfs(v) # 求解出以v为根节点的子树的节点数
  13.                 size = max(size,s) # 更新答案
  14.                 sumnum += s
  15.         # 更新这个ans
  16.         ans = min(ans,max(size,n-sumnum))  
  17.         return sum
  18.          
复制代码
重心实践标题

小红的陡峭值

小红的陡峭值



求解重心求解陡峭值总的值定点数n全部边的陡峭值esum删除的部分顶点边dfs返回的值以u为顶点的子树的总顶点数以u为顶点的子树的陡峭值关注的部分以u为顶点的子树当中,顶点的最大数,这个数目会被拿去更新ans并不关心以u为顶点的子树的陡峭值的最值,而是对于每一个子树的情况都会拿去更新ans
  1. import sys
  2. sys.setrecursionlimit(10 ** 6)
  3. n = int(input())
  4. g = [[] for _ in range(n+1)]
  5. # 类似于求解这个 重心的问题,问题的关键在于从根到叶子,同时在叶子返回这个根的时候动态更新答案
  6. esum = 0
  7. for i in range(n-1):
  8.     u,v = map(int,input().split())
  9.     g[u].append(v)
  10.     g[v].append(u)
  11.     esum += abs(u-v)
  12. ans = float("inf")
  13. vis = [False]*(n+1)
  14. def dfs(u):
  15.     global ans
  16.     vis[u] = True
  17.     # 需要记录以u为根的陡峭值,以及子树的陡峭值
  18.     sumnum = 0
  19.     for v in g[u]:
  20.         if vis[v]:
  21.             continue
  22.         s = dfs(v)
  23.         sumnum += abs(u-v) + s
  24.         # 更新答案
  25.         ans = min(abs(esum-abs(u-v)-s-s),ans)
  26.     return sumnum
  27. dfs(1)
  28. print(ans)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4