Codevs 联合权值

点击就送屠龙宝刀

题目描述 Description
Codevs 联合权值_第1张图片
输入描述 Input Description
Codevs 联合权值_第2张图片
输出描述 Output Description
这里写图片描述
blob.png
样例输入 Sample Input
Codevs 联合权值_第3张图片
样例输出 Sample Output
Codevs 联合权值_第4张图片
Codevs 联合权值_第5张图片
数据范围及提示 Data Size & Hint

这里写图片描述

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

#include 
#include 
#include 
#include 

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;iint 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]10007;
}

int main()
{
    cin>>n;
    for (int i=1;iint 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<' '<2%10007<return 0;
}

你可能感兴趣的:(NOIP,codevs题目)