Luogu P1351 联合权值 题解
- 这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推。。。,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子、或者是兄弟即可。
- 然后问题就变得很简单了,只需要做一个正常的DFS,遍历整棵树,同时判断有没有祖父,如果有就计算,然后遍历自己的儿子,每次判断最大的一个,然后用一个\(sum\)来维护这个点之前的所有兄弟的权值和,挨个计算即可。
- 具体操作见代码,如果有不懂的,代码里面具体解释。
#include<bits/stdc++.h>
#define clean(a,i) memset(a,i,sizeof(a))
#define ll long long
#define inl inline
#define il inl void
#define it inl int
#define ill inl ll
#define re register
#define ri re int
#define rl re ll
#define mod 10007
using namespace std;
template<class T>il read(T &x) //快读
{
int f=1;char k=getchar();x=0;
for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
for(;k>='0'&&k<='9';k=getchar()) x=(x<<3)+(x<<1)+k-'0';
x*=f;
}
const int MAXN = 2e5+5;
int n,u,v,head[MAXN],num_edge,val[MAXN],mx,ans;
struct Edge{
int next,to;
Edge(){}
Edge(int next,int to):next(next),to(to){} //结构体自带生成函数
}edge[MAXN<<1]; //结构体用来存边,因为是无向边,所以大小开两倍
il add_edge(int u,int v){
edge[++num_edge]=Edge(head[u],v);head[u]=num_edge;
edge[++num_edge]=Edge(head[v],u);head[v]=num_edge;
} //加边函数
il DFS(int u,int fa,int gf){ //这道题的主体部分
if(gf) mx=max(mx,val[u]*val[gf]),ans=(ans+(val[u]*val[gf])%mod)%mod; //因为gf是从 0 传下来的,所以当gf不等于 0 的时候,说明这个点有祖父了
ri maxn=0,sum=0; // maxn 用来存这个点前面的兄弟里面最大的一只, sum 用来存前面的兄弟的权值和
for(ri i=head[u];i;i=edge[i].next){
if(edge[i].to==fa) continue;
DFS(edge[i].to,u,fa); //向下递归,然后从叶节点开始回溯
ans=(ans+(sum*val[edge[i].to])%mod)%mod;
mx=max(mx,val[edge[i].to]*maxn); // 更新答案
sum+=val[edge[i].to];sum%=mod;
maxn=max(maxn,val[edge[i].to]); // 更新当前节点的数据
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);
for(ri i=1;i<n;i++) read(u),read(v),add_edge(u,v); //读入边
for(ri i=1;i<=n;i++) read(val[i]); //读入权值
DFS(1,0,0); //solve
printf("%d %d",mx,(ans*2)%mod); //输出,因为是任意点对,所以答案要乘二
return 0;
}
- 还有一点要注意一下,不知道有没有人注意到我代码里面这句:
sum%=mod;
- 我这里取模的原因是因为\(sum\)累加起来,再去和当前节点相乘,可能会超出int的范围,甚至long long也是,要保证答案的正确性,一定要有这一步处理!我自己做的时候就被坑了。。。
- 希望我这片题解能给一些像我一样的肯定都比我强的蒟蒻一些帮助吧*
- 愉快收工!
顺便安利一下自己的博客 虽然还几乎啥都没有
Luogu P1351 联合权值 题解的更多相关文章
- 洛谷 P1351 联合权值 题解
P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\),每条 ...
- luogu P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- [NOIp2014] luogu P1351 联合权值
哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi,每条边的长度均为 111 ...
- 【luogu P1351 联合权值】 题解
题目链接:https://www.luogu.org/problemnew/show/P1351 做了些提高组的题,不得不说虽然NOIP考察的知识点虽然基本上都学过,但是做起题来还是需要动脑子的. 题 ...
- P1351 联合权值(树形dp)
P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...
- 『题解』洛谷P1351 联合权值
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...
- 洛谷——P1351 联合权值
https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...
- P1351 联合权值[鬼畜解法]
题目描述 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离 ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
随机推荐
- Criterion - 一个简单可扩展的 C 语言测试框架
A dead-simple, yet extensible, C test framework. Philosophy Most test frameworks for C require a lot ...
- $_SERVER["HTTP_HOST"]
$_SERVER["HTTP_HOST"]访问的网站的域名
- [IIS] 测试的产品登陆之后有个引用外部站点js的请求半天都无法返回,导致网页一直在打转,Selenium的driver也无法对页面进行下一步的操作
测试的产品登陆之后有个引用外部站点js的请求半天都无法返回: https://cdn.heapanalytics.com/js/heap-3497400264.js 这个js如果是在美国的机器上就可以 ...
- Spring JMX之一:使用JMX管理Spring Bean
spring中关于jmx包括几个概念: MBeanExporter: 从字面上很容易理解, 用来将一些spring的bean作为MBean暴露给MBEanServer.MBeanServerFacto ...
- Nginx学习基础(一)
Nginx是个可靠高效的中间件,就是跟其他语言连接,可以做为一个工具的服务器. 可以处理的问题: 1.反向代理 (1)正向代理(以客户端为主):访问网站的时候,早起是在做通过n多个路由访问网站的操作, ...
- linux每天一小步---awk命令详解
1 命令功能 awk是linux环境下的一个强大的文本工具,由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(默认为空格)隔开,我们就可以将这个文件看成是有很多列的 ...
- WCF双工通信笔记
1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...
- struts2 动态Action
1.java 2.struts.xml struts2.5,默认关闭动态Action,着色的是开启和使用动态action 3.JSP 小结:访问时,用!后跟方法名的方法,方法返回值----->r ...
- Jurassic.ScriptEngine 使用
标记: Jurassic,js,net Jurassic.ScriptEngine是一个让net动态执行js的一个引擎.类似的有ironjs等.支持ECMAScript 5,非线程安全 使用 usin ...
- PostgreSQL 表空间
PostgreSQL 表空间 一 介绍使用表空间可以将不同的表放到不同的存储介质或不同的文件系统下,实际上是为表指定一个存储的目录.创建数据库,表,索引时可以指定表空间,将数据库,表,索引放到指定的目 ...