Codevs 3728 联合权值
问题描述
无向连通图G有n个点,n-1条边。点从1到n依次编号,编号为i的点的权值为Wi ,每
条边的长度均为1。图上两点(u,v)的距离定义为u点到v点的最短距离。对于图G上的点
对(u,v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值。 请问图G上所有可
产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
输入描述
第一行包含1个整数n。接下来n-1行,每行包含2个用空格隔开的正整数u、v,表示编
号为u和编号为v的点之间有边相连。
最后1行,包含n个正整数,每两个正整数之间用一个空格隔开,其中第i个整数表示图G
上编号为i的点的权值为Wi。
输出描述
输出共1行,包含2个整数,之间用一个空格隔开,依次为图G上联合权值的最大值和所有
联合权值之和。由于所有联合权值之和可能很大,输出它时要对 10007 取余。
输入样例
5
12
23
34
45
15 23 10
输出样例
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≤200000,0<Wi≤10000。
题解和代码
很显然这道题用广搜一遍求就可以了。
#include <cstdio>
#include <deque>
#include <vector>
using namespace std;
struct edge_type
{
int u, v, nextu, nextv;
};
struct deque_type
{
int data[200005], h, t;
deque_type()
{
h = 0;
t = 1;
}
void push_back(int key)
{
data[t++] = key;
}
int front()
{
return data[h];
}
void pop_front()
{
++h;
}
bool empty()
{
return h >= t;
}
};
deque_type q;
vector<int> vec;
int w[200005], hu[200005], hv[200005], deep[200005], fa[200005], n;
bool vis[200005];
edge_type edge[200005];
int main()
{
scanf("%d", &n);
int u, v;
for (int i = 1; i < n; ++i)
{
scanf("%d%d", &u, &v);
edge[i].u = u;
edge[i].v = v;
edge[i].nextu = hu[u];
edge[i].nextv = hv[v];
hu[u] = i;
hv[v] = i;
}
for (int i = 1; i <= n; ++i)
scanf("%d", w + i);
deep[1] = 1;
fa[1] = 0;
vis[1] = true;
q.push_back(1);
int now, k, p, nowpos;
int maxx = 0, summ = 0, value, nowsum, tmp, nowmax;
while (!q.empty())
{
now = q.front();
nowsum = 0;
nowmax = 0;
q.pop_front();
nowpos = q.t;
k = hu[now];
if(deep[now] > 2)
{
value = w[now] * w[fa[fa[now]]];
if (maxx < value) maxx = value;
summ += value;
summ %= 10007;
}
while (k)
{
p = edge[k].v;
if (!vis[p])
{
tmp = (nowsum % 10007) * (w[p] % 10007);
summ += tmp;
summ %= 10007;
tmp = nowmax * w[p];
if (tmp > maxx) maxx = tmp;
q.push_back(p);
nowsum += w[p];
nowsum %= 10007;
if(nowmax < w[p]) nowmax = w[p];
vis[p] = true;
deep[p] = deep[now] + 1;
vec.push_back(p);
fa[p] = now;
}
k = edge[k].nextu;
}
k = hv[now];
while (k)
{
p = edge[k].u;
if (!vis[p])
{
tmp = (nowsum % 10007) * (w[p] % 10007);
summ += tmp;
summ %= 10007;
tmp = nowmax * w[p];
if (tmp > maxx) maxx = tmp;
q.push_back(p);
nowsum += w[p];
nowsum %= 10007;
if(nowmax < w[p]) nowmax = w[p];
vis[p] = true;
deep[p] = deep[now] + 1;
vec.push_back(p);
fa[p] = now;
}
k = edge[k].nextv;
}
}
summ = (summ + summ) % 10007;
printf("%d %d\n", maxx, summ);
}
Codevs 3728 联合权值的更多相关文章
- 3728 联合权值[NOIP 2014 Day1 T2]
来源:NOIP2014 Day1 T2 OJ链接: http://codevs.cn/problem/3728/ https://www.luogu.org/problemnew/show/P1351 ...
- 「NOIP2014」「Codevs3728」 联合权值(乱搞
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输入描述 Input Description 输出描述 Ou ...
- codevs3728联合权值(LCA)
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 输入描述 Input Des ...
- 联合权值(codevs 3728)
Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...
- NOIP2014联合权值
无向连通图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< ...
随机推荐
- 无密钥登录的自动脚本实现(ssh-copy-id、expect免交互输入脚本)
感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...
- Eclipse 的单步调试
1.设置断点在程序里面放置一个断点,也就是双击需要放置断点的程序左边的栏目上. 2.调试(1)点击"打开透视图"按钮,选择调试透视图,则打开调试透视图界面,然后先设置断点,按调试按 ...
- LVS集群之NAT模式实现
LVS集群之NAT模式实现 一.集群的种类 集群系统主要分为 1.HA:高可用集群,又叫双机热备. (a)原理 2台机器A,B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至 ...
- textarea输入回车,前台jsp不回车问题解决
jsp引入标签: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"% ...
- webservice发布服务:AXIS2及客户端调用
1.Axis2: 到官网下载axis2的压缩包. 解压后: 1.将lib文件下的jar包复制到项目中 2.在web-inf下创建services->META-INF->services.x ...
- javascript判断给定字符串是否是回文
//判断给定字符串是否是回文 function isPalindrome(word) { var s = new Stack(); for (var i = 0 ...
- 51nod1130(斯特林近似)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1130 题意: 中文题诶~ 思路: 直接斯特林公式就好了~ ...
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- 使用Navicat 导入导出Mysql数据库
1 导出 另外一种方式 2 导入,新建数据名称 3 导入,运行sql文件(步骤1中的) 推荐使用SQLyog进行导入数据比较好
- 【Junit 报错】Test class should have exactly one public zero-argument constructor和Test class can only have one constructor
错误1: java.lang.Exception: Test class should have exactly one public zero-argument constructor at org ...