本文主要是介绍AcWing 511:联合权值 ← DFS、链式前向星,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题目来源】
https://www.acwing.com/problem/content/513/
【题目描述】
无向连通图 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 取余。
【数据范围】
1<n≤200000,
0<Wi≤10000
【输入样例】
5
1 2
2 3
3 4
4 5
1 5 2 3 10
【输出样例】
20 74
【算法分析】
本例代码,采用链式前向星存无向图,并基于此进行无向图的深度优先搜索。详见:
https://blog.csdn.net/hnjzsyjyj/article/details/119917795
链式前向星的相关介绍可参考:
https://blog.csdn.net/hnjzsyjyj/article/details/119917795
https://blog.csdn.net/hnjzsyjyj/article/details/127190456
https://blog.csdn.net/hnjzsyjyj/article/details/126474608
【算法代码】
代码来源于:https://www.acwing.com/solution/content/3516/
/* 链式前向星存图
val[idx] 表示第 idx 条边的权值。
e[idx] 表示第 idx 条边的终点。
ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。
h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用 ne[idx]=h[a] 时,也即使用 h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。
*/#include <bits/stdc++.h>
using namespace std;const int N=2e5+5;
const int M=N<<1;
const int mod=10007;int n;
int h[N],e[M],ne[M],idx;
int w[N];
int f[N],g[N];
int imax, isum;void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void dfs(int u, int father) {int sum=0, maxv=0;for(int i=h[u]; ~i; i=ne[i]) { //~i; equivalent to i!=-1;int j=e[i];if(j!=father) {dfs(j,u);imax=max(imax,w[u]*f[j]);imax=max(imax,maxv*w[j]);maxv=max(maxv,w[j]);isum=(isum+w[u]*g[j])%mod;isum=(isum+sum*w[j])%mod;sum=(sum+w[j])%mod;f[u]=max(f[u],w[j]);g[u]=(g[u]+w[j])%mod;}}
}int main() {scanf("%d",&n);memset(h,-1,sizeof(h));for(int i=0; i<n-1; i++) {int a,b;scanf("%d %d",&a,&b);add(a,b),add(b,a);}for(int i=1; i<=n; i++) scanf("%d",&w[i]);dfs(1,-1);printf("%d %d\n",imax,2*isum%mod);return 0;
}/*
in:
5
1 2
2 3
3 4
4 5
1 5 2 3 10out:
20 74
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/119917795
https://www.acwing.com/solution/content/3516/
https://blog.csdn.net/hnjzsyjyj/article/details/127190456
https://blog.csdn.net/hnjzsyjyj/article/details/126474608
这篇关于AcWing 511:联合权值 ← DFS、链式前向星的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!