NOIp2014提高组

【题目描述】

无向连通图G 有n 个点,n - 1 条边。点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为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 的点的权值为W i 。

输出格式:

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

【输入输出样例】

输入样例#1:

5
1 2
2 3
3 4
4 5
1 5 2 3 10 

输出样例#1:

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 < n≤ 100 ; 
对于60% 的数据,1 < n≤ 2000; 
对于100%的数据,1 < n≤ 200 , 000 ,0 < wi≤ 10, 000 。

【思路】

 60%:用暴力搜索可以将解决60%的数据,如果i和j相连,j和k相连,i和k不相连,那么可以认为i和k可以构成联合最大权值,用一个O(N^3)的循环即可。

 100%:

  这个题AC的思路很多,可以跑树,用LCA处理两个兄弟之间的关系,也可以跑图,想要,存储一定要用前向星。(不会问度娘)。我能够AC还要感谢@yangs_s,如果不是他的博客http://blog.csdn.net/yangs_s/article/details/47359967,这个题我也做不出AC来的,我在这里把他的思路说一下吧。

  有两个关键点。

  首先输出分为两部分,可以把题目分成两部分来看,对一个点来说,最大的乘积自然就是和它相邻的两个权值最大的节点的权值的乘积, 读入后顺手处理一下就能出来。

  第二个关键点就是加法结合律。

  没错,加法结合律!

  我看到神犇的博客后伏案长叹,这是小学三年级的内容,我就这样还给老师了。

  我们假设和o点相邻的点有a,b,c,d,e,f,g七个,假设他们的权值就是a,b,c,d,e,f,g。某二逼青年的计算过程是这样的:sum:=a·b+a·c+a·d…….+a….+e*g….,但其实我们这样处理,我们先用加法运算法则,发现sum其实就是每个点的权值乘以可以联合(距离为2)的节点的所有权值之和,所以说,我们在读入数据的时候,可以预先处理一下,把每个节点周围相邻节点的权值之和给加起来,就以上述为例,在处理时,把a,b,c….g的权值加起来为s[o]{o点相邻点的权值之和},然后在计算时,就可以用sum:=a·(s[o]-a)+b·(s[o]-b)…..很自然的结果就出来了!

  算法的时间复杂度应该是O(kn),k应该是一个很小很小远小于N的常数,应该和LCA的差不多了吧。

const ma=10007;
const mx=200000;type ss=recordu,v:longint;end;var s:array[1..mx] of int64;//s[i]表示和结点i所有相连的点的权值之和e:array[1..mx] of ss;//存的是边w,max1,max2:array[1..mx]of longint;
{w[i]表示第i个点的权值max1[i]表示和i相连得结点中权值最大的结点max2[i]表示和i相连得结点中权值最小的结点}n,i,j,ans1,ans2:longint;procedure box;
var i,j:longint;
beginfillchar(s,sizeof(s),0);fillchar(e,sizeof(e),0);fillchar(w,sizeof(w),0);fillchar(max1,sizeof(max1),0);fillchar(max2,sizeof(max2),0);ans1:=0;ans2:=0;
end;
//变量初始化procedure work(x:longint;var a,b:longint);
//x的值是不会被改变的,a和b是可以被改变的
begin
//首先已经得出值的数组是合法的,再次更改过后也一定是合法的if x>a thenbeginb:=a;a:=x;endelseif x>b then b:=x;
end;
//用来比较大小的过程,必须用全局变量procedure change;
var i,u,v:longint;
beginfor i:=1 to n-1 dobeginu:=e[i].u;v:=e[i].v;inc(s[u],w[v]);inc(s[v],w[u]);work(w[v],max1[u],max2[u]);work(w[u],max1[v],max2[v]);//不断更新结点周围的最大值和次大值end;
end;
//预处理程序procedure main1;
var i:longint;
beginfor i:=1 to n doif max1[i]*max2[i]>ans1 thenans1:=max1[i]*max2[i];
end;
//处理最大的联合权值procedure main2;
var i,j,u,v:longint;
beginfor i:=1 to n-1 dobeginu:=e[i].u;v:=e[i].v;ans2:=(ans2+((s[u]-w[v])*w[v]) mod ma) mod ma;ans2:=(ans2+((s[v]-w[u])*w[u]) mod ma) mod ma;end;
end;
//处理权值之和procedure init;
var i,j:longint;
beginreadln(n);for i:=1 to n-1 doreadln(e[i].u,e[i].v);for i:=1 to n do read(w[i]);
end;procedure printf;
beginwriteln(ans1,' ',ans2);
end;beginbox;init;change;main1;main2;printf;
end.

转载于:https://www.cnblogs.com/yangqingli/p/4721774.html

[NOIP2014]联合权值相关推荐

  1. [Luogu 1351] NOIP2014 联合权值

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

  2. NOIP2014联合权值

    枚举+乘法结合律 枚举每个点左右相邻的两个点乘积和,做(a+b+c...)(a+b+c...)的时候展开减掉a^2+b^2+c^2再除以2就是答案了 注意爆int取模 1 #include<io ...

  3. 联合权值 NOIP2014 提高组 Day1 T2

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

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

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

  5. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

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

  6. P1351 联合权值[鬼畜解法]

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

  7. 洛谷 1351 联合权值

    [题解] 每个点维护各个儿子的前后缀最大值.权值和,这样就可以统计儿子之间相乘的答案.然后每个节点再乘它的祖父的权值去更新答案即可. 1 #include<cstdio> 2 #inclu ...

  8. Jzoj3931【NOIP2014day1官方数据】联合权值

    题意略过,口胡正解 对于每个节点i,我们求出每个与i相连的节点的权值和s,那么i的贡献就是∑d[j]*(s-d[j]) 求最大就排个序咯 #include<stdio.h> #includ ...

  9. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

最新文章

  1. Android开发之ListView子布局item高度的问题
  2. java 中符号_谁能告诉我java中符号的用法,见代码
  3. 【计算机科学基础】计算机不需要整数减法器的原因
  4. OJ1003: 两个整数的四则运算
  5. PL/SQL Developer SQL Window中不能插入多条数据
  6. 尝试引用非结构体数组的字段_剖析PHP底层数组是如何实现的
  7. 计算机考研408的优势和劣势,21考研:杭州电子科技大学计算机改考408!透露2个信号,咋整?...
  8. George Moody 对OSEA 软件的修改
  9. AS中几个较好的插件
  10. kettle 数据库密码解密
  11. 盘点那些年我们一起玩过的网络安全工具
  12. linux进程终止命令,Linux kill命令:终止进程
  13. 如何解决 Windows 2000 设备管理器中列出的未知设备问题(转)
  14. 神经网络不work该怎么办!看看这11条
  15. python非线性最小二乘拟合_非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]...
  16. [转载]kindle屏幕出现小黑点,怎么办?
  17. 【数据结构】之两栈共享空间(C语言)
  18. 顺口溜记23种设计模式
  19. 电脑上不去网的6点原因
  20. java 支付宝回调校验签名_支付宝异步回调验证签名

热门文章

  1. 利用nvm管理Node的版本
  2. SQL Server 2012笔记分享-29:日志文件的工作方式
  3. netapp学习(五)---创建volume
  4. DATAGUARD配置错误的解决日志
  5. Android 编程规范与常用技巧
  6. Linux 解压命令
  7. 企业内部信息化项目管理之我所见
  8. Gitlab的CI/CD初尝试
  9. Java并发编程—Atomic原子类
  10. 剖析Picasso中的内存缓存机制——LruCache