无向连通图G有n个点,n-1条边。点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1。图上两点(u, v)的距离定义为u点到v点的最短距离。对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值。

请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?

题目链接:codevs http://www.cnblogs.com/smileandyxu/p/5348411.html

图论问题,70分暴力都很好打吧,只要枚举所有点dfs找到他的距离为二的点,维护一个tot和一个max就可以了,细节自己想想,代码

等下会贴出来,正解是乘法的结合律,这个题目可以转换一下,对于每个点对,可以看成由一点中间点中转而成,就是每个点对中必定有

且只隔一个点吧,因为图是棵树,只要枚举每个入度为1的点作为中转点,然后将其儿子与其他所有儿子相乘就可以了,但这是n平方的啊!会超时。

所以我们用乘法原理,统计所有儿子权值和,然后用权值和剪去自己的权值的值再乘自己的权值,这样就是O(n)完成了。

另外,推荐我的博客:http://www.cnblogs.com/renjianshige/

暴力代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAXN=;
using namespace std;
struct edge{
int first;
int next;
int to;
int quan;
}a[*MAXN];
bool b[MAXN];
struct node{
int now;
int fa;
node(){}
node(int _now,int _fa):now(_now),fa(_fa){}
};
int dian[MAXN];
int in[MAXN];
int n,num=;
void addedge(int from,int to){
a[++num].to=to;
a[num].quan=;
a[num].next=a[from].first;
a[from].first=num;
}
long long tott=,big=;
void dfs(int now,int fa,int time){
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==fa) continue;
if(time==){
if(b[to]) continue;
long long dianquan=dian[fa]*dian[to];
big=max(big,dianquan);
tott=(tott+dianquan)%;
continue;
}
dfs(to,now,time+);
}
}
int main(){
memset(dian,,sizeof(dian));
memset(b,,sizeof(b));
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
for(int i=;i<=n;i++){
scanf("%d",&dian[i]);
}
for(int i=;i<=n;i++){
dfs(i,,);
b[i]=;
}
printf("%lld %lld\n",big,(tott*)%);
return ;
}

AC代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAXN=;
using namespace std;
struct edge{
int first;
int next;
int to;
int quan;
}a[*MAXN];
bool b[MAXN];
int dian[MAXN];
int in[MAXN];
int n,num=;
void addedge(int from,int to){
a[++num].to=to;
a[num].quan=;
a[num].next=a[from].first;
a[from].first=num;
}
long long tott=,big=;
void dfs(int now){
long long tot=,big1=,big2=;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
tot=(tot+dian[to])%;
if(dian[to]>big1)
{
big1=dian[to];
continue;
}
if(dian[to]<=big1&&dian[to]>big2) big2=dian[to];
}
for(int i=a[now].first;i;i=a[i].next){
tott+=dian[a[i].to]*(tot-dian[a[i].to])%;
if(tott<) tott+=;
tott=tott%;
}
if(big<big1*big2) big=big1*big2;
}
int main(){
memset(dian,,sizeof(dian));
memset(b,,sizeof(b));
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
in[x]++;
in[y]++;
}
for(int i=;i<=n;i++){
scanf("%d",&dian[i]);
}
for(int i=;i<=n;i++){
if(in[i]==) continue;
dfs(i);
}
printf("%lld %lld\n",big,tott%);
return ;
}

NOIP2014联合权值的更多相关文章

  1. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  2. NOIP2014 联合权值

    2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...

  3. 【洛谷P1351】[NOIP2014]联合权值

    联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...

  4. [NOIP2014]联合权值 题解

    题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...

  5. luogu1351 [NOIp2014]联合权值 (dfs)

    有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...

  6. NOIP 2004 联合权值

    洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...

  7. [NOIP2014] 提高组 洛谷P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  8. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  9. NOIP2014提高组第二题联合权值

    还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...

随机推荐

  1. Java日志之Slf4j,Log4J,logback原理总结

    几乎任何应用,一定是需要日志的. 那么,面对种类繁多的日志框架和配置,我们该何去何从? 1.前奏:我是在研究mybatis源码的过程中才意识到需要搞明白日志原理这回事,因为mybatis(和一些其他开 ...

  2. ajax 发送json数据时为什么需要设置contentType: "application/json”

    1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别? contentType: "application/j ...

  3. GIT常见问题及其解决方案

    问题: remote: Permission to beijing01/learn_github.git denied to liuhongyang02. fatal: unable to acces ...

  4. Python 为了提升性能,竟运用了共享经济

    大家或许知道,Python 为了提高内存的利用效率,采用了一套共用对象内存的分配策略. 例如,对于那些数值较小的数字对象([-5, 256]).布尔值对象.None 对象.较短的字符串对象(通常 是 ...

  5. Git的使用(三)远程仓库添加及克隆

    Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的, ...

  6. ElasticSearch常见经典面试题

    1.为什么要使用Elasticsearch? ​ 因为在我们商城中的数据,将来会非常多,所以采用以往的模糊查询,模糊查询前置配置,会放弃索引,导致商品查询是全表扫面,在百万级别的数据库中,效率非常低下 ...

  7. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  8. linux安装python串口工具pyserial遇到不能成功导入的问题

    常规方法:pip install pyserial导入serial后提示: 解决方法:apt install python3-serial 参考:https://stackoverflow.com/q ...

  9. DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值

    场景 Winform中实现ZedGraph的多条Y轴(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1001322 ...

  10. rocketmq学习(一) rocketmq介绍与安装

    1.消息队列介绍 消息队列本质上来说是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息).但对于一个成熟可靠的消息队列来说 ...