noip2014-day1-t2

  题目描述:无向连通图G 有n 个点,n - 1 条边。点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 。图上两点( u , v ) 的距离定义为u 点到v 点的最短距离。对于图G 上的有序点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值。请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?所有联合权值之和在输出时对10007取模。

  最简单也最容易想出来的办法肯定是暴力了,枚举每个点,对于第一问以该点为中间节点来找与它直接相连的点中的权值最大的两个即可。而对于第二问,比较暴力的方法就是两层枚举,假如与当前结点相连的点有a,b,c,d....计算a*b+a*c+a*d+…+b*a+b*c+b*d+b*e+…+c*a+c*b+c*d+c*e+…即可,但这样复杂度会爆炸,最差的复杂度会达到O(n^2)。。只有70分。。。于是我们可以稍加优化

  那怎样快速求出上面的式子?观察上面的式子我们可以发现每个点都是与除了自己以外的其他点相乘让后相加的,于是我们可以化为下面的式子:令sum=a+b+c+...,我们只需要计算a*(sum-a)+b*(sum-b)+…即可。这样我们就可以快速计算出所有权值了,且复杂度为O(n)。

  此题还需注意存储两个答案的变量要用longlong类型(因为计算联合权值时计算一次就有可能超过int类型),并且计算联合权值之和的时候要边计算边对10007取模,不然会溢出。

转载于:https://www.cnblogs.com/hyl2000/p/5742941.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值