传送门

https://www.cnblogs.com/violet-acmer/p/9937201.html

题解:

  相关变量解释:

  1. int n;
  2. int fa[maxn];//fa[i] : i的父亲节点
  3. int w[maxn];//w[i] : i的权值
  4. long long sum[maxn];//sum[i] : i节点的所有儿子节点的权值和
  5. int maxSon1[maxn];//maxSon1[i] : i节点的所有儿子中权值最大值(如果有超过两个儿子)
  6. int maxSon2[maxn];//maxSon2[i] : i节点的所有儿子中权值第二大值(如果有超过两个儿子)
  7. vector<int >G[maxn];//存边
  8. vector<int >son[maxn];//son[i] : 记录节点 i 的所有儿子节点

  步骤:

  (1):先Dfs(u,f)预处理出节点u的父亲节点fa[u],儿子节点son[u],儿子节点的权值和sum[u],以及儿子节点的权值最大的前两个权值maxSon1[u],maxSon2[u];

  (2):如果某节点 i 含有两个及以上儿子,则每两个儿子间也可构成长度为 2 的边长,求出节点 i 的儿子节点的联合权值,并判断是否可以更新联合权值的最大值;

  (3):求 i 节点与其父亲的父亲节点 j 构成的联合权值,并将其二倍(i 与 j 构成联合权值,同样 j 与 i 也可以构成联合权值,所以需要加入两个)与加入到联合权值之和

       中,并判断是否可以更新联合权值的最大值。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb(x) push_back(x)
  4. #define mem(a,b) memset(a,b,sizeof(a))
  5. const int maxn=+;
  6. const int MOD=;
  7.  
  8. int n;
  9. int fa[maxn];
  10. int w[maxn];
  11. long long sum[maxn];
  12. int maxSon1[maxn];
  13. int maxSon2[maxn];
  14. vector<int >G[maxn];
  15. vector<int >son[maxn];
  16. void addEdge(int u,int v)
  17. {
  18. G[u].pb(v);
  19. G[v].pb(u);
  20. }
  21. void Dfs(int u,int f)
  22. {
  23. fa[u]=f;
  24. for(int i=;i < G[u].size();++i)
  25. {
  26. int to=G[u][i];
  27. if(to != f)
  28. {
  29. son[u].pb(to);
  30. sum[u] += w[to];
  31. if(w[to] > maxSon1[u])
  32. {
  33. if(maxSon1[u] > maxSon2[u])
  34. maxSon2[u]=maxSon1[u];
  35. maxSon1[u]=w[to];
  36. }
  37. else if(w[to] > maxSon2[u])
  38. maxSon2[u]=w[to];
  39. Dfs(to,u);
  40. }
  41. }
  42. }
  43.  
  44. void Solve()
  45. {
  46. mem(sum,);
  47. mem(maxSon1,);
  48. mem(maxSon2,);
  49. Dfs(,-);
  50. int maxRes=;
  51. int res=;
  52. for(int i=;i <= n;++i)//步骤(2)
  53. {
  54. if(son[i].size() >= )
  55. {
  56. maxRes=max(maxRes,maxSon1[i]*maxSon2[i]);
  57. for(int j=;j < son[i].size();++j)
  58. res=res%MOD+((sum[i]-w[son[i][j]])%MOD)*(w[son[i][j]]%MOD);
  59. }
  60. }
  61. for(int i=;i <= n;++i)//步骤(1)
  62. {
  63. if(fa[i] != )
  64. {
  65. maxRes=max(maxRes,w[fa[fa[i]]]*w[i]);
  66. res=res%MOD+*w[fa[fa[i]]]*w[i];
  67. }
  68. }
  69. printf("%d %d\n",maxRes,res%MOD);
  70. }
  71. int main()
  72. {
  73. scanf("%d",&n);
  74. for(int i=;i < n;++i)
  75. {
  76. int u,v;
  77. scanf("%d%d",&u,&v);
  78. addEdge(u,v);
  79. }
  80. for(int i=;i <= n;++i)
  81. scanf("%d",w+i);
  82. Solve();
  83. }

  坑:  

    步骤(2)的情况刚开始忘了,然后,吃了一发wa.................

NOIP 提高组 2014 联合权值(图论???)的更多相关文章

  1. 题解【luoguP1351 NOIp提高组2014 联合权值】

    题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...

  2. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  3. 【NOIP2014提高组】联合权值

    https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...

  4. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  5. [NOIp 2014]联合权值

    Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...

  6. NOIp 2014 联合权值 By cellur925

    题目传送门 这题自己(真正)思考了很久(欣慰). (轻而易举)地发现这是一棵树后,打算从Dfs序中下功夫,推敲了很久规律,没看出来(太弱了). 开始手动枚举距离为2的情况,模模糊糊有了一些概念,但没有 ...

  7. NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...

  8. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  9. NOIP 2014 T2 联合权值 DFS

    背景 NOIP2014提高组第二题 描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对 ...

随机推荐

  1. python设计模式第九天【策略模式】

    1. 定义 对一系列算法进行封装,为所有算法定义一个抽象的算法接口,可以平滑的进行算法切换 2. 策略模式的UML图 3.代码实现 #!/usr/bin/env python #! _*_ codin ...

  2. 多IP地址--笔记

    多IP 地址特性使虚拟用户可以在一个load generator上运行且被识别为多个IP地址 1 虚拟IP是同一个generator上的多个IP,这种分配过程由controller自动来进行 2 对于 ...

  3. dbExpress操作中用TDBGrid显示数据

    由于一些数据感知组件如TDBGrid等是需要用到数据缓存的,这和dbExpress组件的存取机制是矛盾的.所以当打开数据集时会出现如下内容的警告框:“Operation not allowed on ...

  4. 十、ABP

    一.官网 安装 安装成功Core 2.2版本的

  5. 5.cgroup资源控制

    控制组( CGroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离.限制.审计等. 只有将分配到容器的资源进行控制,才能避免多个容器同时运行时对宿主机系统的资源竞争.每个控制组是一组 ...

  6. codeforces472C

    Design Tutorial: Make It Nondeterministic CodeForces - 472C A way to make a new task is to make it n ...

  7. 【Tensorflow】Tensorflow入门教程

    基本使用 使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来表示计算任务. 在被称之为 会话 (Session) 的上下文 (context) 中执行图. 使 ...

  8. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  9. 基准对象object中的基础类型----字符串 (三)

    object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...

  10. Codeforces734 E. Anton and Tree

    传送门:>Here< 题意:给出一颗树,节点不是黑色就是白色,每次可以将一个颜色相同的块变颜色,问最少变几次才能让其变为同色 解题思路: 我们考虑由于每一次都是把同样颜色的色块进行变色,因 ...