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 点到 ...
随机推荐
-
Python 的安装与配置(Windows)
Python2.7安装配置 python的官网地址:https://www.python.org/ 我这里下载的是python2.7.12版本的 下载后点击安装文件,直接点击下一步知道finally完 ...
-
字符串哈希函数(String Hash Functions)
哈希函数举例 http://www.cse.yorku.ca/~oz/hash.html Node.js使用的哈希函数 https://www.npmjs.org/package/string-has ...
-
ARC机制下组合关系
// // Person.h // 01-autorelease基本概念 // // Created by apple on 14-3-18. // Copyright (c) 2014年 a ...
-
CodeForces 534D Program B
Description On February, 30th n students came in the Center for Training Olympiad Programmers (CTOP) ...
-
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named &#39;__frch_lableId_0&#39; in &#39;class com.cd.entity.Page&#39;
#号改为$即可
-
C/C++中数据的存储
学java时了解到不同的数据在系统中存储的位置不一样,有的存在栈里,有的存在堆里.学C/C++时没注意过这个,最近学数据结构时遇到了问题:在定义一个结构体的指针时,系统如何给它分配的空间?从而让我想去 ...
-
Echarts关于仪表盘
https://blog.csdn.net/zc763375777/article/details/53837391 来无事,制作不一样的图标一发,领导让把仪表盘做成百分条,我TM也是醉了,大体样式如 ...
-
Mac下Java JDK的下载安装和配置
一.下载安装 打开一个搜索引擎,输入JDK,找到Java JDK 如图: 点击打开,同意协议开始下载如图: 下载好以后,安装即可. 安装成功以后,进入根目录,可以找到JDK安装的位置: 资源库——& ...
-
Linux系统级日志系统
linux日志系统,在不同的发行版本名字不同.本质一样都是对系统运行非正常状态的记录... rhel5.x syslogrhel6.x rsyslog service rsyslog st ...
-
tomcat catalina.out日志切割(logrotate)
简单说明: 1,因为tomcat日志会一直往catalina.out里面输出,所以回到值catalina.out非常大,占用磁盘空间 2,日志非常大,查看日志就需要很长时间. 3,据说catalina ...