码迷,mamicode.com
首页 > 其他好文 > 详细

noip2014-day1-t2

时间:2016-08-05 23:06:10      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

  题目描述:无向连通图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取模,不然会溢出。

noip2014-day1-t2

标签:

原文地址:http://www.cnblogs.com/hyl2000/p/5742941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!