【题解】洛谷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\)条边.点从 ...
随机推荐
- servlet开发(二)之servlet的线程安全问题
之所以考虑线程安全问题,是因为引入了多线程.多线程指的是这个程序(一个进程)运行时产生了不止一个线程.如果不考虑多线程的话,程序执行只有一条路径,就像人在敲代码的时候只能敲代码,不能戴上耳机听歌.引入 ...
- C Primer Plus note9
undefined reference to `WinMain@16'| 运行程式的时候出现了这样的错误,而且编译器也没有提示是哪一行出错: 经过百度搜索,发现了问题所在: 上面的图中main()函数 ...
- 数据上下文中的AddOrUpdate方法
AddOrUpdate是扩展方法,需要添加引用 using System.Data.Entity.Migrations;
- web前端优化之内容优化
前端内容优化主要有以下几条: 1.尽量减少http请求 (1)合并文件,把多个css文件合并在一起: (2)css Sprites,把css相关的background元素进行背景图绝对定位: (3)图 ...
- ASP.NET 页面之间传递值的几种方式
1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer4.Applicatio ...
- [小北De编程手记] : Lesson 05 - Selenium For C# 之 API 下
上一篇,我们介绍了一些Selenium WebDriver相关的API,下面我们就接着上一篇继续介绍Selenium常用的API,这一篇的内容主要涉及到以下话题: Selenium API:复杂事件处 ...
- JavaScript中sort()方法
sort()方法主要是用于对数组进行排序,默认情况下该方法是将数组元素转换成字符串,然后按照ASC码进行排序,这个大家都能理解,但如果数组元素是一个Object呢,转不了字符串,难道不能进行排序?答案 ...
- 推卡:“积分侠”的福利 广发DIY信用卡
广发diy信用卡最大的优势在持卡人在三大类商户刷卡消费可享受3倍积分优惠,很多卡友不知道这些商户到底有哪些,以及商户mcc码是什么,下面和小编一起来看看. 可享受3倍积分的商户类型 持卡人可在以下三大 ...
- SVNKit学习——Setting Up A Subversion Repository 创建仓库(三)
所谓Setting Up A Subversion Repository,就是在Subversion所在的服务器上创建一个仓库,说白了就是在磁盘上建一个特殊的目录,这里我以windows举例. 1.使 ...
- MVC Dropdownlist数据绑定 默认值
@Html.DropDownList("Data", (SelectList)ViewBag.Data, new { @class = "form-control cho ...