题目:http://www.luogu.org/problem/show?pid=1351#
分析:图论,需要进行简单优化,否则TLE
代码:
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int Tmax=200005;
int n,w[Tmax];
vector<int> G[Tmax];
long long int ans=-1,sum,sw[Tmax];
void work()
{
int i,j,len;
long long int t;
for(i=1;i<=n;i++)
{
len=G[i].size();
for(j=0;j<len;j++)
{
t=w[G[i][j]];
sum=(sum+(t*(sw[i]-t))%10007)%10007;
}
}
return;
}
void add(int from,int to)
{
G[from].push_back(to);
return;
}
void init()
{
int i,a,b,t;
long long int max1,max2;
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d %d",&a,&b);
add(a,b);
add(b,a);
}
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
{
max1=-1,max2=-2;
b=G[i].size();
for(a=0;a<b;a++)
{
t=w[G[i][a]];
sw[i]+=t;
if(t>max1){
max2=max1;
max1=t;
}
else if(t>max2) max2=t;
}
ans=max(ans,max1*max2);
}
return;
}
int main()
{
init();
work();
printf("%lld %lld",ans,sum);
return 0;
}