您的位置:首页 > 其它

Codevs 联合权值

2015-10-16 16:36 411 查看
点击就送屠龙宝刀

题目描述 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: