NOIP2014 联合权值
2.联合权值
(link.cpp/c/pas)
【问题描述】
无向连通图G有n个点,n-1条边。点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1。图上两点(u, v)的距离定义为u点到v点的最短距离。对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值。
请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
【输入】
输入文件名为link.in。
第一行包含1个整数n。
接下来n-1行,每行包含2个用空格隔开的正整数u、v,表示编号为u和编号为v的点之间有边相连。
最后1行,包含n个正整数,每两个正整数之间用一个空格隔开,其中第i个整数表示图G上编号为i的点的权值为Wi。
【输出】
输出文件名为link.out。
输出共1行,包含2个整数,之间用一个空格隔开,依次为图G上联合权值的最大值和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对10007取余。
【输入输出样例】
|
link.in |
link.out |
|
5 1 2 2 3 3 4 4 5 1 5 2 3 10 |
20 74 |
【样例说明】
本例输入的图如上所示,距离为2的有序点对有(1,3)、(2,4)、(3,1)、(3,5)、(4,2)、(5,3)。其联合权值分别为2、15、2、20、15、20。其中最大的是20,总和为74。
【数据说明】
对于30%的数据,1<≤100;
对于60%的数据,1<≤2000;
对于100%的数据,1<≤200,000,0<Wi ≤10,000。
【思路】
分析题目:n个点n-1条边的连通图是树。
注意到题目的特殊性:距离为2。可以得知对于每一个结点它的任意两个相连点都可以产生联合权值。枚举需要O(n^3)的时间。
优化:解决max:注意到对于一个结点而言,产生的联合权值最大为子节点中最大两个W的积。
解决sum:suma= w1*w2+…+w1*wn+w2*w1+w2*w3…+w2*wn+…..=sumw^2-w1^2-w2^2…。因此只需要O(n)的时间就能求出suma。
【代码】
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = + ; //从1 小心越界
const int MOD = ; int w[maxn];
int maxw=,sumw=,n;
vector<int> G[maxn]; //vector加速BFS void BFS(int s) {
int vis[maxn]; FOR(i,,n+) vis[i]=;
queue<int> q;
q.push(s); vis[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
int suma=,sumb=;
suma=(suma*suma)%MOD;
int max1=,max2=;
FOR(i,,G[u].size()) {
int v=G[u][i];
suma = (suma+w[G[u][i]]) % MOD;
sumb = (sumb+(w[v]*w[v]%MOD)) % MOD;
if(w[v]>max1) {max2=max1; max1=w[v];} //如是更新 否则会导致漏解
else if(w[v]>max2) max2=w[v]; if(!vis[v]) {
vis[v]=; q.push(v);
}
}
sumw=(sumw+((suma*suma)%MOD-sumb+MOD)%MOD)%MOD; //注意诸多MOD
maxw=max(maxw,max1*max2);
}
} int main() {
ios::sync_with_stdio(false);
cin>>n;
//从1开始标号
FOR(i,,n-) {
int u,v; cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
FOR(i,,n+) cin>>w[i]; BFS(); cout<<maxw<<" "<<sumw;
return ;
}
NOIP2014 联合权值的更多相关文章
- [Luogu 1351] NOIP2014 联合权值
[Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...
- 【洛谷P1351】[NOIP2014]联合权值
联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...
- NOIP2014联合权值
无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...
- [NOIP2014]联合权值 题解
题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...
- luogu1351 [NOIp2014]联合权值 (dfs)
有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...
- NOIP 2004 联合权值
洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- Noip2014 提高组 T2 联合权值 连通图+技巧
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
随机推荐
- 1014: [JSOI2008]火星人prefix - BZOJ
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- jQuery.serializeArray() 函数详解
serializeArray()函数用于序列化一组表单元素,将表单内容编码为一个JavaScript数组. serializeArray()函数常用于将表单内容序列化为JSON对象,以便于被编码为JS ...
- hibernate一对一双向外键关联
一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...
- VS2005中SetUnhandledExceptionFilter函数应用
很多软件通过设置自己的异常捕获函数,捕获未处理的异常,生成报告或者日志(例如生成mini-dump文件),达到Release版本下追踪Bug的目的.但是,到了VS2005(即VC8),Microsof ...
- Objective-C 协议(protocol)
协议(protocol)是Objective-c中一个非常重要的语言特性,从概念上讲,非常类似于JAVA中接口. 一个协议其实就是一系列有关联的方法的集合(为方便后面叙述,我们把这个协议命名为myPr ...
- 关于DJANGO和JAVASCRIPT的时间
最近,实际一些简单统计时,要到库里去检索数据出来用HIGHCHARTS画图, 作一个简单的回照.. DJANGO用TEMPLATEVIEW来作.专业,正规:) class SAView(Templat ...
- mac 升级后 web 服务器起不来 问题
4. Apache 要本地调试代码的时候发现Apache也不能幸免地跪了.执行apachectl -v发现Apache已经更新到2.4.9版本了.一定又是因为版本更新出了什么差错. 4.1 修改htt ...
- GridView中DataKeyNames的应用小结
一. GridView的DataKeyNames属性设为"ID,Name" GridView1.DataKeyNames = new string[]{ "ID" ...
- module_init宏解析 linux驱动的入口函数module_init的加载和释放
linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...
- 64位ubuntu安装WPS
http://jingyan.baidu.com/article/d3b74d64afd96f1f77e609a3.html http://sixipiaoyang.blog.163.com/blog ...