问题描述

无向连通图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 联合权值的更多相关文章

  1. 3728 联合权值[NOIP 2014 Day1 T2]

    来源:NOIP2014 Day1 T2 OJ链接: http://codevs.cn/problem/3728/ https://www.luogu.org/problemnew/show/P1351 ...

  2. 「NOIP2014」「Codevs3728」 联合权值(乱搞

    3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 输入描述 Input Description 输出描述 Ou ...

  3. codevs3728联合权值(LCA)

    3728 联合权值  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 输入描述 Input Des ...

  4. 联合权值(codevs 3728)

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

  5. NOIP2014联合权值

    无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...

  6. P1906联合权值

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

  7. [NOIP2014] 提高组 洛谷P1351 联合权值

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

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

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

  9. 【洛谷P1351】联合权值

    我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...

随机推荐

  1. MySQL 5.6 for Windows 解压缩版配置安装

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...

  2. python 单步调试初探(未完待续)

    pdb 调试: import pdb pdb.set_trace()     pudb 调试: http://python.jobbole.com/82638/

  3. javascript闭包和作用域链

    最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...

  4. Android adapter适配器的学习

    学习Android有一点时间,说说自己的学习感悟. 首先呢,先说说适配器的作用,顾名思义,它就是把数据定义好一定的规则,使得我们可以用到ListView GridView等上面 所以说这玩意,还是得好 ...

  5. C++ 基础知识复习(五)

    UML建模部分 70. 什么是UML: 答: Unified Modeling Language, 统一建模语言,是一种标准的图形化建模语言.是面向对象分析和设计的标准表示. 71. UML有哪些图: ...

  6. SqlServer性能检测和优化工具使用详细(转)

    转载链接:http://www.cnblogs.com/knowledgesea/p/3683505.html 工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,s ...

  7. 【Mybatis框架】查询缓存(一级缓存)

    做Java的各位程序员们,估计SSH和SSM是我们的基础必备框架.也就是说我们都已经至少接触过了这两套常见的集成框架.当我们用SSH的时候,相信很多人都接触过hibernate的两级缓存,同样,相对应 ...

  8. NOIP2009多项式输出(水)【A004】

    [A004]潜伏者[难度A]—————————————————————————————————————————————————————————————————————————— [题目要求] 一元 n ...

  9. docker1.4版本devicemapper修改容器硬盘大小

    升级docker最新版(1.4.0)后,发现容器的硬盘空间只有10G,如果需要指定初始硬盘大小,目前的做法还比较粗暴,更改docker daemon的启动命令,然后删掉目前机器的已有镜像,重启dock ...

  10. 【软件推荐】 Moom-窗口布局软件(V.3.2.2)【破解+汉化】

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书”     下载地址: 软件:https://yunpan.cn/cuTg8rCMTsLT6 ...