NOIP 提高组 2014 联合权值(图论???)
https://www.cnblogs.com/violet-acmer/p/9937201.html
题解:
相关变量解释:
int n;
int fa[maxn];//fa[i] : i的父亲节点
int w[maxn];//w[i] : i的权值
long long sum[maxn];//sum[i] : i节点的所有儿子节点的权值和
int maxSon1[maxn];//maxSon1[i] : i节点的所有儿子中权值最大值(如果有超过两个儿子)
int maxSon2[maxn];//maxSon2[i] : i节点的所有儿子中权值第二大值(如果有超过两个儿子)
vector<int >G[maxn];//存边
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代码:
#include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=+;
const int MOD=; int n;
int fa[maxn];
int w[maxn];
long long sum[maxn];
int maxSon1[maxn];
int maxSon2[maxn];
vector<int >G[maxn];
vector<int >son[maxn];
void addEdge(int u,int v)
{
G[u].pb(v);
G[v].pb(u);
}
void Dfs(int u,int f)
{
fa[u]=f;
for(int i=;i < G[u].size();++i)
{
int to=G[u][i];
if(to != f)
{
son[u].pb(to);
sum[u] += w[to];
if(w[to] > maxSon1[u])
{
if(maxSon1[u] > maxSon2[u])
maxSon2[u]=maxSon1[u];
maxSon1[u]=w[to];
}
else if(w[to] > maxSon2[u])
maxSon2[u]=w[to];
Dfs(to,u);
}
}
} void Solve()
{
mem(sum,);
mem(maxSon1,);
mem(maxSon2,);
Dfs(,-);
int maxRes=;
int res=;
for(int i=;i <= n;++i)//步骤(2)
{
if(son[i].size() >= )
{
maxRes=max(maxRes,maxSon1[i]*maxSon2[i]);
for(int j=;j < son[i].size();++j)
res=res%MOD+((sum[i]-w[son[i][j]])%MOD)*(w[son[i][j]]%MOD);
}
}
for(int i=;i <= n;++i)//步骤(1)
{
if(fa[i] != )
{
maxRes=max(maxRes,w[fa[fa[i]]]*w[i]);
res=res%MOD+*w[fa[fa[i]]]*w[i];
}
}
printf("%d %d\n",maxRes,res%MOD);
}
int main()
{
scanf("%d",&n);
for(int i=;i < n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
addEdge(u,v);
}
for(int i=;i <= n;++i)
scanf("%d",w+i);
Solve();
}
坑:
步骤(2)的情况刚开始忘了,然后,吃了一发wa.................
NOIP 提高组 2014 联合权值(图论???)的更多相关文章
- 题解【luoguP1351 NOIp提高组2014 联合权值】
题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...
- Noip2014 提高组 T2 联合权值 连通图+技巧
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
- 【NOIP2014提高组】联合权值
https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...
- Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)
Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...
- [NOIp 2014]联合权值
Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...
- NOIp 2014 联合权值 By cellur925
题目传送门 这题自己(真正)思考了很久(欣慰). (轻而易举)地发现这是一棵树后,打算从Dfs序中下功夫,推敲了很久规律,没看出来(太弱了). 开始手动枚举距离为2的情况,模模糊糊有了一些概念,但没有 ...
- NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 参考资料: [1]:https://www.luogu.org/blog/xxzh242 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- NOIP 2014 T2 联合权值 DFS
背景 NOIP2014提高组第二题 描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对 ...
随机推荐
- django学习自修第一天【简介】
1. MVC框架 MVC框架的核心思想是解耦,降低各功能之间的耦合性,方便重构代码 (1)低耦合,高内聚 (2)高可扩展性 (3)向后兼容 2. MVT框架 V(视图):核心处理,接受请求,调用模型获 ...
- 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示
代码功能: 1.datagrid 的表头由后台生成,可以配置在数据库 2.datagrid 的列绑定数据 支撑嵌套对象 $(function() { var columns = new Array() ...
- 转 MySQL 日期类型详解
MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ ---- ...
- Linq:使用Take和Skip实现分页
Skip,Take: list = list.Skip(pageNum * pageSize).Take(pageSize).ToList(); pageSize :表示一页多少条. pageNum: ...
- Unable to resolve target 'android-15'
SDK 15没有加载造成的,在SDK Manager.exe下安装以下文件 Android SDK Tools (25.2.5) Android SDK Platform-tools (28.0.1) ...
- python基础数据类型--list列表
列表: 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex ...
- NMAP网络扫描工具的安装与使用
简介 NMAP是一款流行的网络扫描和嗅探工具也是一个强大的端口扫描类安全测评工具,被广泛应用在黑客领域做漏洞探测以及安全扫描,更多的nmap是一个好用的网络工具,在生产和开发中也经常用到,主要做端口开 ...
- #195 game(动态规划+二分)
考虑第一问的部分分.显然设f[i]为i子树从根开始扩展的所需步数,考虑根节点的扩展顺序,显然应该按儿子子树所需步数从大到小进行扩展,将其排序即可. 要做到n=3e5,考虑换根dp.计算某点答案时先将其 ...
- HYSBZ1036-树链剖分-点权
树链剖分,点权,单点更改,路径查询.学树链剖分下面这个博文不错 http://blog.csdn.net/y990041769/article/details/40348013 线段树必须写的很熟练才 ...
- BZOJ1835 [ZJOI2010] 基站选址 【动态规划】【线段树】
题目分析: 首先想一个DP方程,令f[m][n]表示当前在前n个村庄选了m个基站,且第m个基站放在n处的最小值,转移可以枚举上一个放基站的村庄,然后计算两个村庄之间的代价. 仔细思考两个基站之间村庄的 ...