szj想了个没有存图的做法,存了每个顶点所关联顶点的权值和。例如,顶点1关联顶点a1,a2,a3;则第一条边是a1,第二次是a1*a2,第三次就是a3*(a1+a2)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MaxN=200000;
const int MOD=10007;
int n;
long long f[MaxN],t[MaxN];
long long value[MaxN],vs[MaxN];
long long sum[MaxN],Max[MaxN];
int main(){
scanf("%d",&n);
for(int i=1;i<=n-1;++i){
scanf("%lld%lld",f+i,t+i);
}
for(int i=1;i<=n;++i){
scanf("%lld",value+i);
}
long long ans1=0,ans2=0;
for(int i=1;i<=n-1;++i){
ans1=max(ans1,max(Max[f[i]]*value[t[i]],Max[t[i]]*value[f[i]]));//求最大值
ans2=(ans2+(value[f[i]]*sum[t[i]])+(value[t[i]]*sum[f[i]]));//求总和
sum[f[i]]+=value[t[i]];
sum[t[i]]+=value[f[i]];
Max[f[i]]=max(Max[f[i]],value[t[i]]);
Max[t[i]]=max(Max[t[i]],value[f[i]]);
}
printf("%lld %lld\n",ans1,2*ans2%MOD);
return 0;
}

本文介绍了一种图算法的优化方案,通过存储每个顶点关联顶点的权值和而非具体的图片,来减少内存消耗并提高计算效率。这种方法适用于解决特定类型的图论问题,如寻找最大值路径和计算所有路径的总权值。
602

被折叠的 条评论
为什么被折叠?



