联合权值(题解)

题目描述

无向连通图 GG 有 nn 个点,n-1n−1 条边。点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi?,每条边的长度均为 11。图上两点 (u, v)(u,v) 的距离定义为 uu 点到 vv 点的最短距离。对于图 GG 上的点对 (u, v)(u,v),若它们的距离为 22,则它们之间会产生W_v \times W_uWv?×Wu? 的联合权值。

请问图 GG 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?

输入格式

第一行包含 11 个整数 nn。

接下来 n-1n−1 行,每行包含 22 个用空格隔开的正整数 u,vu,v,表示编号为 uu 和编号为 vv 的点之间有边相连。

最后 11 行,包含 nn 个正整数,每两个正整数之间用一个空格隔开,其中第 ii 个整数表示图 GG 上编号为 ii 的点的权值为 W_iWi?。

输出格式

输出共 11 行,包含 22 个整数,之间用一个空格隔开,依次为图 GG 上联合权值的最大值和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对1000710007取余。

输入输出样例

输入 #1复制

5
1 2
2 3
3 4
4 5
1 5 2 3 10 

输出 #1复制

20 74

题目分析

看到题目首先想到链式前向性连图,遍历每个点,从每个点衍生,找到中继点,再通过中继点找到终点,就这样遍历求和和最大值

for(int i=1;i<=n;i++){        for(int j=frt[i];j;j=nxt[j]){            int zjd=ex[j];            for(int k=frt[zjd];k;k=nxt[k]){                int zd=ex[k];                if(zd!=i){                    long long opo=w[i]*w[zd];                    maxn=max(maxn,opo);                    ans+=opo;                }            }        }    }

但是,很明显,一些情况下时间复杂度达到了0(n^2)

于是我们需要优化,由于n个点,n-1条边,所以这是棵树

枚举根节点,其所有的儿子节点距离都为2,可以压掉一半

for(int i=1;i<=n;i++){        long long max1=0,max2=0;int sum=0;        for(int j=frt[i];j;j=nxt[j])        {            int son=ex[j];            if(w[son]>max1){                max2=max1;                    max1=w[son];            }else if(w[son]>max2)max2=w[son];            ans=(ans+sum*w[son])%mod;            sum=(sum+w[son])%mod;        }        maxn=max(max1*max2,maxn);    }

原文地址:https://www.cnblogs.com/qibaike/p/11396885.html

时间: 2024-12-11 13:10:56

联合权值(题解)的相关文章

Luogu P1351 联合权值 题解

这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS,遍历整棵树,同时判断有没有祖父,如果有就计算,然后遍历自己的儿子,每次判断最大的一个,然后用一个\(sum\)来维护这个点之前的所有兄弟的权值和,挨个计算即可. 具体操作见代码,如果有不懂的,代码里面具体解释. #include<bits/stdc++.h> #define clean(a,i)

[NOIP2014]联合权值 题解

题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条边都被跑了两次,所以复杂度为O(n). 用邻接表存储要开双倍数组(无向),当然像cyk大神一样直接跑边就不用考虑这个了. 代码: 邻接表: 1 #include<cstdio> 2 const int mo=10007,M=200008; 3 int cnt,x,y,n,i,ans,tot,w[M

[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的点之间有边相连.

codevs3728联合权值(LCA)

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

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

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

[FZYZOJ 2044] [NOIP 2014 D1T2] 联合权值

[NOIP2014_D1_T2]联合权值 时间限制:1000MS 内存限制:131072KB Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v 点的最短距离.对于图 G 上的点对 (u,v),若它们的距离为 2,则它们之间会产生Wv×Wu 的联合权值. 请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? I

P1906联合权值

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

[noip2014day1-T2]联合权值

无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离.对于图 G 上的点对(u, v),若它们的距离为 2,则它们之间会产生Wu*Wv的联合权值.请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 题解:树形dp: #include<iostream> #include<cstring> #include&l

洛谷 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 行,每