code3728 联合权值
一开始暴搜,超时3个点...
后来看了题解:
首先,两个点的距离为2当且仅当它们都与一个点直接相连
反过来说,一个点所有的出边的终点都是互相距离2的(最大值可以依靠这个方法,前向星处理的时候将每个点的最大出点和次大出点存起来,最后过一遍比较乘积)
那么,所有点对的权值和就是每一个点所产生的点对权值和的总和
但此时,如若要对每一个点的出点进行两两配对,每一个点需要O(e^2)(e为该点出度)
只要有一个点有太多的出边就会TLE,此时我们我可以利用乘法分配律
w[i]*w[j1]+w[i]*w[j2]+...+w[i]*w[jn]=w[i]*(w[j1]+...+w[jn])
我们定义一个点的围权和为到该点距离为1的点的权值和
从这个式子中,我们可以看见:i点所产生的权值和,相当于是与i点直接相连的那些点中(j1,j2,j3...),每个点(j1,j2,j3)的围权和的和,每个围权和减去自己本身,再乘以该点权值
再利用前向星存储,这样时间复杂度会直接降到O(n)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define Size 200005
using namespace std; int IN[Size][]; struct node{
int to;
int next;
}edge[Size*];
int head[Size]; int n;
int w[Size];
long long sum=; int largest=-;
int L[Size][];
long long d[Size]; void check(int a,int b){
int ww=w[b];
if(ww>L[a][]){
L[a][]=L[a][];
L[a][]=ww;
}else if(ww>L[a][])L[a][]=ww;
} int main(){
memset(head,-,sizeof(head));
freopen("3728.in","r",stdin); cin>>n;
int a,b;
for(int i=;i<n;i++)scanf("%d%d",&IN[i][],&IN[i][]);
for(int i=;i<=n;i++)scanf("%d",w+i);
for(int i=;i<n;i++){
a=IN[i][]; b=IN[i][];
edge[i*-].to=b; edge[i*-].next=head[a]; head[a]=*i-;
check(a,b); d[a]+=w[b];
edge[i*].to=a; edge[i*].next=head[b]; head[b]=*i;
check(b,a); d[b]+=w[a];
} for(int i=;i<=n;i++){
largest=max(largest,L[i][]*L[i][]);
}
for(int i=;i<=n;i++){
for(int j=head[i];j!=-;j=edge[j].next){
int x=edge[j].to;
sum+=(w[x]*(d[i]-w[x])%)%;
sum%=;
}
} cout<<largest<<' '<<sum<<endl; return ;
}
code3728 联合权值的更多相关文章
- Codevs 3728 联合权值
问题描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每 条边的长度均为1.图上两点(u,v)的距离定义为u点到v点的最短距离.对于图G上的点 对(u,v),若它 ...
- P1906联合权值
描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 【洛谷P1351】联合权值
我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...
- Noip2014 提高组 T2 联合权值 连通图+技巧
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
- NOIP2014 联合权值
2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
- 【NOIP2014提高组】联合权值
https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...
随机推荐
- linux保存的设置用户/组ID(set-user-ID)的测试
直接贴代码和结果 // FileName: id.cpp #include <iostream> #include <unistd.h> using namespace std ...
- HttpURLConnection的使用步骤
创建一个URL对象: URL url = new URL(http://www.baidu.com); 调用URL对象的openConnection( )来获取HttpURLConnection对象实 ...
- HBase之二:Hbase优化
1. 预先分区 默认情况下,在创建 HBase 表的时候会自动创建一个 Region 分区,当导入数据的时候,所有的 HBase 客户端都向这一个 Region 写数据,直到这个 Region ...
- Jetty实战(杂七杂八)
最近开始选择JETTY作为服务器了,乘这现在空闲点学习了些JETTY的部署知识,原来她真的跟TOMCAT很类似,先总结如下: 部署应用方法(下载好jetty); 方法一: 直接将应用的 war包放在j ...
- 第六章 通过Service访问Pod(下)
6.4 外网如何访问service (1)ClusterIp: Service通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可以访问,这是默认的Service类型. (2 ...
- 2017百度之星初赛A-1006(HDU-6113)
思路:在图的外面包一圈'0'字符,然后dfs统计'0'字符的个数和'1'字符的个数.结果如下(num0表示0字符的个数,num1表示1字符的个数): num0 == 1 && num1 ...
- 【游记】noip2017酱油记
2017-10-14:初赛 12:00:比赛时间14:30-16:30,由于比赛地点在二附中,我12点就坐上了地铁(无力吐槽,周六中午人还那么多,站了一路). 13:45:到了efz,所有人都被拦在了 ...
- Java多线程面试问题集锦
参看:http://www.importnew.com/1428.html
- WinForm多线程+委托防止界面卡死
1.当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Gener ...
- 「小程序JAVA实战」springboot的后台搭建(31)
转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...