联合权值——o(n)做法

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

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;    
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值