联合权值

描述

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

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

格式

输入格式

第一行包含 1 个整数 n。

接下来 n-1 行,每行包含 2 个用空格隔开的正整数 u、v,表示编号为 u 和编号为 v 的点 之间有边相连。

最后 1 行,包含 n 个正整数,每两个正整数之间用一个空格隔开,其中第 i 个整数表示 图 G 上编号为 i 的点的权值为WiWi

输出格式

输出共 1 行,包含 2 个整数,之间用一个空格隔开,依次为图 G 上联合权值的最大值 和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对10007取余。

样例1

样例输入1[复制]

 
  1. 5
  2. 1 2
  3. 2 3
  4. 3 4
  5. 4 5
  6. 1 5 2 3 10

样例输出1[复制]

 
  1. 20 74

限制

对于 30%的数据,1 < n ≤ 100;

对于 60%的数据,1 < n ≤ 2000;

对于 100%的数据,1 < n ≤ 200,000,0 < WiWi ≤ 10,000。

解题报告:

  刚开始的时候,是直接想的暴力,用一个O(n^3)然后我想我一定是疯了,200000,数组也大的不行,就把电脑弄死机了。。。正在考试,学校的电脑一关机就什么都没有了,于是,苦逼的我只好重新把第一题写一遍,还好简单。可接下来,我就陷入了想第二题的深渊,无法自拔,看出他是一棵树后,开始学着树规编,可是树规也没学好,还不是特别熟悉,最后还剩半个小时,算了算了,写暴力。。啊,暴力还没有调出来,就交卷了。

  所以,要加快做题速度。

  正解:首先枚举每一个点,找他周围的最大与第二大的点,相乘的联合权值则为以这个点为中心的最大值,最后把所有点的最大权值扫一遍,然后就得到ans2.至于权值之和,我们举一个例子:

     i 这个点连了 1 2 3 三个点 ,那么权值之和即:w1*w2+w1*w3+w2*w3,技巧来了,根据乘法分配律,原式=w1*0+w2*w1+w3*(w1+w2)

  根据这个,可以设一个数组存括号内的累和,然后与当前相乘,加入ans1;

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int maxn=,inf=;
  5. int n,ans,maxx;
  6. int m1[maxn],m2[maxn],a[maxn],b[maxn],w[maxn];
  7. long long s[maxn],s2[maxn],sum;
  8. void doit(int x,int y)
  9. {
  10. if (m1[x]==) m1[x]=w[y];
  11. else if (w[y]>m2[x])
  12. {
  13. if (w[y]>m1[x]){
  14. m2[x]=m1[x];
  15. m1[x]=w[y];
  16. }else{
  17. m2[x]=w[y];
  18. }
  19. }
  20. s[x]=(s[x]+w[y]*s2[x])%inf;
  21. s2[x]+=w[y];
  22. }
  23. int main()
  24. {
  25. freopen("link.in","r",stdin);
  26. freopen("link.out","w",stdout);
  27. cin>>n;
  28. for (int i=;i<=n-;i++)
  29. scanf("%d%d",&a[i],&b[i]);
  30. for (int i=;i<=n;i++)
  31. scanf("%d",&w[i]);
  32. for (int i=;i<=n;i++)
  33. {
  34. int x=a[i],y=b[i];
  35. doit (x,y);
  36. doit (y,x);
  37. }
  38. for (int i=;i<=n;i++)
  39. {
  40. if (m1[i]*m2[i]>maxx) maxx=m1[i]*m2[i];
  41. ans=(ans+s[i])%inf;
  42. }
  43. cout<<maxx<<" "<<(ans*)%inf;
  44. return ;
  45. }

值得注意的是:ans最后要乘2,因为有两个方向,另外,取mod 也很重要,特别是最后输出的时候。

我认为在这么多方法中,这个是最简单而易懂的。

Noip2014 提高组 T2 联合权值 连通图+技巧的更多相关文章

  1. 【NOIP2014提高组】联合权值

    https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...

  2. NOIP 提高组 2014 联合权值(图论???)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 相关变量解释: int n; int fa[maxn];//fa[i] : i的 ...

  3. 题解【luoguP1351 NOIp提高组2014 联合权值】

    题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...

  4. NOIP 2014 T2 联合权值 DFS

    背景 NOIP2014提高组第二题 描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对 ...

  5. 【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值

    不难发现,树中与某个点距离为2的点只可能是它的父亲的父亲.儿子的儿子 或者 兄弟,分类讨论一下即可. 只有对于兄弟我们不能暴力搞,维护一下每个节点的所有儿子的前缀和.前缀MAX就行了. #includ ...

  6. NOIP2014提高组 DAY1 -SilverN

    T1  生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的 ...

  7. noip2014 提高组

    T1 生活大爆炸版 石头剪刀布 题目传送门 就是道模拟题咯 #include<algorithm> #include<cstdio> #include<cstring&g ...

  8. NOIP2014提高组 题解报告

    D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...

  9. 【学术篇】luogu1351 [NOIP2014提高组] 联合权值

    一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一 ...

随机推荐

  1. [js]事件综合 整理

    原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html 事件流:页面接收事件的顺序,IE提出了事件冒泡流,Netscape提出了事件捕获流. 事件冒泡 ...

  2. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  3. 转:C++中Static作用和使用方法

    转自:http://blog.csdn.net/artechtor/article/details/2312766 1.什么是static?       static 是C++中很常用的修饰符,它被用 ...

  4. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

  5. drupal里面的ajax最粗浅的理解-流程

    1,  form里面的ajax所在地表单元素有一个事件,激发system/ajax,相应的有ajax_form_callback(), 会把被改变的元素值传到form_state[values]中, ...

  6. linux 重命名文件和文件夹

    linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式 ...

  7. 美国半个互联网瘫痪对开发者使用DNS的启发

    版权声明:本文由腾讯云DNSPod团队原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/174 来源:腾云阁 https:// ...

  8. 使用mybatis操作mysql数据库SUM方法返回NULL解决

    使用SQL语句用函数SUM叠加的时候,默认查询没有值的情况下返回的是NULL,而实际可能我们要用的是返回0 解决: SELECT SUM(total)   FROM test_table 改成: SE ...

  9. js将long日期格式转换为标准日期格式

    <script language="javascript"> //扩展Date的format方法 Date.prototype.format = function (f ...

  10. IE和主流浏览器

    1.添加事件 addEventListener 主流 attachEvent     IE 2.移除事件 removeEventListener detachEvent 3.获取事件对象 event ...