Codevs 联合权值

点击就送屠龙宝刀

题目描述 Description
这里写图片描述
输入描述 Input Description
这里写图片描述
输出描述 Output Description
这里写图片描述
blob.png
样例输入 Sample Input
这里写图片描述
样例输出 Sample Output
这里写图片描述
这里写图片描述
数据范围及提示 Data Size & Hint

这里写图片描述

此题目有坑!不用在意说什么(u,v)是最短距离,直接从第一个点dfs,每隔一层递加一遍并取max,同时要注意及时取模以免炸int。。(反正我是int存的)。记忆化什么的就不用说了。。这题太水直接贴代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

long long n,p,k,w[200010];
bool vis[200010];
vector <int> edge[200010];

void dfs(int x,int last1,int last2)
{
    vis[x]=1;
    long long t=0,t2=0,t3=0,t4=0;
    for (int i=0;i<edge[x].size();i++)
    {
        int y=edge[x][i];
        if (!vis[y])
        {
            vis[y]=1;
            if (last1!=0)
            {
                k=(k+w[y]*w[last1])%10007;
                p=max(p,w[y]*w[last1]);
            }
            t2+=t*w[y]; t+=w[y];
            if (w[y]>=t3)
            {
                t4=t3; t3=w[y];
            }
            if (w[y]<t3) t4=max(t4,w[y]);
            dfs(y,x,last1);
        }
    }
    p=max(t3*t4,p); k=(k+t2)%10007;
}

int main()
{
    cin>>n;
    for (int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    for (int i=1;i<=n;i++) cin>>w[i];
    dfs(1,0,0);
    cout<<p<<' '<<k*2%10007<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值