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

来源:互联网 发布:linux socket多线程 编辑:程序博客网 时间:2024/06/16 12:01

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



原创粉丝点击