[luoguP1351] 联合权值(Dfs)

传送门

距离为2的点会产生权值,第一问,只需要在dfs的时候把一个点相邻的点都处理出来就行。

具体处理方式看代码,然而这样只处理了一遍,最后在乘2就好了。

第二问只需要处理一个点相邻的点中最大的和次大的就行。

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #define LL long long
 5
 6 const int MAXN = 200001, p = 10007;
 7 int n, cnt;
 8 int head[MAXN], to[MAXN << 1], next[MAXN << 1];
 9 LL max, tot, a[MAXN], sum[MAXN], ans[MAXN], max1[MAXN], max2[MAXN];
10 bool vis[MAXN];
11
12 inline int read()
13 {
14     int x = 0, f = 1;
15     char ch = getchar();
16     for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
17     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
18     return x * f;
19 }
20
21 inline LL Max(LL x, LL y)
22 {
23     return x > y ? x : y;
24 }
25
26 inline void add(int x, int y)
27 {
28     to[cnt] = y;
29     next[cnt] = head[x];
30     head[x] = cnt++;
31 }
32
33 inline void dfs(int u)
34 {
35     int i, v;
36     vis[u] = 1;
37     for(i = head[u]; i ^ -1; i = next[i])
38     {
39         v = to[i];
40         ans[u] = (ans[u] + sum[u] * a[v]) % p;
41         sum[u] = (sum[u] + a[v]) % p;
42         if(a[v] > max1[u]) max2[u] = max1[u], max1[u] = a[v];
43         else if(a[v] > max2[u]) max2[u] = a[v];
44         if(!vis[v]) dfs(v);
45     }
46 }
47
48 int main()
49 {
50     int i, x, y;
51     n = read();
52     memset(head, -1, sizeof(head));
53     for(i = 1; i < n; i++)
54     {
55         x = read();
56         y = read();
57         add(x, y);
58         add(y, x);
59     }
60     for(i = 1; i <= n; i++) a[i] = read();
61     dfs(1);
62     for(i = 1; i <= n; i++)
63     {
64         tot = (tot + ans[i]) % p;
65         max = Max(max, max1[i] * max2[i]);
66     }
67     printf("%lld %lld\n", max, (tot << 1) % p);
68     return 0;
69 }

时间: 2024-08-07 11:04:21

[luoguP1351] 联合权值(Dfs)的相关文章

luoguP1351 联合权值

题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 思路:注意题目中这是一个无向连通图,且被n-1条边连着,这让我们想起什么呢,这就是一个树,而且退化成了一条链.

codevs3728联合权值(LCA)

3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 输入描述 Input Description 输出描述 Output Description 样例输入 Sample Input 样例输出 Sample Output 数据范围及提示 Data Size & Hint /* 自己打暴力,看了看不用打LCA只处理倍增数组 然后就10分了...... 神奇的LCA 估计打了能有60分 只能看峰峰.

AC日记——联合权值 洛谷 P1351

题目描述 无向连通图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 行,

树讲解(3)——联合权值

洛谷——1351 联合权值 题目描述 无向连通图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

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

一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一贴就算了呗.. 但还是要说说的.... 首先,题目里说:"无向连通图G 有n 个点,n - 1 条边." 我们可以知道这是一棵树(怕不是废话..),这样遍历的时候就能保证是O(n)级别了.. 找最大值 很简单,遍历树的时候找一下与每个点相连的点的最大值和次大值一乘就完了...显然这么贪心是

P1351 联合权值(树形dp)

P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #include<iostream> #include<cstdio> #include<cstring> #define re register using namespace std; const int p=10007; int max(int &a,int &

$Noip2014/Luogu1351$ 联合权值 树形

$Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所有的联合权值之和.注意这两个数是有序的,翻译成人话就是求完和之后要$*2$. $Sol$ 想起了消防局的设立$ovo$. 距离为$2$的点,它们不是兄弟就是祖孙,那直接$dfs$一遍更新答案就好了叭. 兄弟之间更新答案这里有两个优化: 1.贪心.把所有的兄弟加入数组$s$之后按照$w[i]$从大到小排序,一遍

[NOIP2014]联合权值

描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入格式 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开的正整数u.v,表示编号为u和编号为v的点之间有边相连.

洛谷 P1351 联合权值(NOIp2014D1T2)

题目描述 无向连通图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 行,每