【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)
题目来源:洛谷P1351
思路
由题意可得图为一棵树
在一棵树上距离为2的两个点有两种情况
- 当前点与其爷爷
 - 当前点的两个儿子
 
当情况为当前点与其爷爷时比较好操作
只需要在传递时不仅传递父亲 还传递爷爷即可
当情况为两个儿子时
其实我们只需要的是所有儿子中比较大的两个
所以我们在遍历当前点的所有儿子时取出最大值和次大值即可
最后的最大值为两种情况中的最大值
最后的答案为当前点的所有儿子权值的平方减去每个儿子本身的平方(容斥原理)+2*最大*次大(乘以2是因为每种情况有正反两种)
代码
#include<iostream>
using namespace std;
#define maxn 200020
#define mod 10007
int n,cnt,ans,Max;
int h[maxn],w[maxn];
struct Edge
{
int to;
int next;
}e[maxn*];
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].next=h[u];
h[u]=cnt;
}
void dfs(int u,int fa,int gr)//u为当前点 fa为父亲 gr为爷爷
{
int m1=,m2=,sum=,num=;//m1为最大 m2为次大 sum为所有儿子的权值 num为所有儿子本身的平方
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa) continue;//如果是父亲就跳过
sum=(sum+w[v])%mod;//计算所有儿子权值
num=(num+w[v]*w[v]%mod)%mod;//计算儿子本身平方
if(w[v]>m1)//判断最大和次大
{
m2=m1;
m1=w[v];
}
else if(w[v]>m2)
m2=w[v];
dfs(v,u,fa);
}
Max=max(Max,max(m1*m2,w[u]*w[gr]));//注意最大值不用取mod
ans=(ans+(sum*sum%mod-num+mod)%mod+w[u]*w[gr]*%mod)%mod;//总值计算
}
int main()
{
cin>>n;
for(int i=;i<n;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++) cin>>w[i];
dfs(,,);
cout<<Max<<" "<<ans;
}
【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)的更多相关文章
- 【洛谷P1351】联合权值
		
我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...
 - 洛谷 题解 P1351 【联合权值】
		
Problem P1351 [联合权值] record 用时: 99ms 空间: 13068KB(12.76MB) 代码长度: 3.96KB 提交记录: R9883701 注: 使用了 o1 优化 o ...
 - $Noip2014/Luogu1351$ 联合权值 树形
		
$Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...
 - 洛谷P1351 联合权值(树形dp)
		
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
 - 洛谷P1908 逆序对 [权值线段树]
		
题目传送门 逆序对 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的 ...
 - 洛谷 P1351 联合权值 —— 树形DP
		
题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...
 - 洛谷 1351 联合权值——树形dp
		
题目:https://www.luogu.org/problemnew/show/P1351 对拍了一下,才发现自己漏掉了那种拐弯的情况. #include<iostream> #incl ...
 - 洛谷 P1351 联合权值 题解
		
P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条 ...
 - 『题解』洛谷P1351 联合权值
		
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...
 
随机推荐
- html/JS onload的详解
			
等待页面都加载完后再执行 <!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...
 - Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
			
环境 Android Studio 3.0 升级&导入项目 错误 Error:java.util.concurrent.ExecutionException: com.android.tool ...
 - 基于Java实现简单亚马逊爬虫
			
前言:最近博主买了台Kindle,感觉亚马逊上的图书资源质量挺好,还时不时地会有价格低但质量高的书出售,但限于亚马逊并没有很好的优惠提醒功能,自己天天盯着又很累.于是,我自己写了一个基于Java的亚马 ...
 - python模块之contexlib
			
一.上下文管理器 with是python实现上下文管理器的核心关键词.它能够在代码执行前和执行后做一些额外的事情. 最常见的代码恐怕就是文件操作了. with open("file" ...
 - 多实例部署多个tomcat
			
注意点: 1.多实例tomcat的更新维护,需要考虑如何能“优雅”地对所有实例进行升级: 2.尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装 ...
 - VC++ IPv6的支持
			
最近根据项目需要,要在产品中添加对IpV6的支持,因此研究了一下IPV6的相关内容,Ipv6 与原来最直观的改变就是地址结构的改变,IP地址由原来的32位扩展为128,这样原来的地址结构肯定就不够用了 ...
 - vue 数组重复,循环报错
			
Vue.js默认不支持往数组中加入重复的数据.可以使用track-by="$index"来实现.
 - 如何解决git fatal: refusing to merge unrelated histories
			
我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法p ...
 - 使用dojo.connect()添加事件的注意事项
			
使用dojo.connect()添加事件处理器是很方便的,不用再考虑跨浏览器的问题了.但要想正确地使用这个方法,仍然要注意几个问题: 1.用dojo.byId()获取的是dom元素,而用 ...
 - 使用jxls技术导入Excel模版数据(转自其他博客)
			
第一步:先确定好Excel导入的格式以及各表格字段值的含义 第二步:定义好解析的XML--videoConfig.xml <?xml version="1.0" encodi ...