问题描述

无向连通图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 sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

  2. Unity3D LuaComponent(基于ulua)

    LuaComponent可以支持配一个需要执行在这个gameObject上的lua脚本,并且每个gameObject上的lua都是一个实例 using UnityEngine; using LuaIn ...

  3. Scrapy001-框架初窥

    Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...

  4. 16进制ascii码转化为对应的字符,付ipmitool查询硬件信息

    最近工作需要在用ipmitool查询服务器硬件信息.ipmitool查询硬件信息 比如电源,使用命令: 获取PSU0信息:Ipmitool raw 0x3a 0x71 0x00: 获取PSU1信息:I ...

  5. Markdown的简单实用

    Markdown Markdown是一种标记语言,能让笔者像写代码代码一样写文档,不用再为文档的排版样式而费心.

  6. 如何在 SSAS服务器之间做同步

    简介: 从SQL Server 2005开始,分析服务就支持了同步的功能.本文将介绍如何在SQL Server 2012下同步Adventureworks的分析服务数据库.通过同步的功能,我们就来可以 ...

  7. [linux] grep awk sort uniq学习

    grep的-A-B-选项详解grep能找出带有关键字的行,但是工作中有时需要找出该行前后的行,下面是解释1. grep -A1 keyword filename找出filename中带有keyword ...

  8. Android中的ANR

    有过Android开发经历的人都不会对ANR陌生,它和崩溃一样是程序设计的问题.本文将以较为深入的视角来介绍什么是ANR,出现场景,如何避免以及如何定位分析ANR,希望可以帮助大家在编写程序时有所帮助 ...

  9. openfoam 的安装【转载】

    原文地址: http://blog.sina.com.cn/s/blog_14bf001d10102wifw.html OpenFOAM安装 OpenFOAM基于Linux系统下运行,由于对Linux ...

  10. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...