[noip] 2014复赛提高组day1 联合权值

本蒟蒻自己想的方法,非常好,哈哈哈哈哈哈哈 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,u,v,num;
struct edge{
	int next;
	int to;
} a[2000000];//注意数组的大小,就OK了
int head[2000000],w[200006],max5,sum;
int main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	 {
	 	cin>>u>>v;
	 	num++;
	 	a[num].next=head[u];//邻接表
	 	a[num].to=v;
	 	head[u]=num;
	 	num++;
	 	a[num].next=head[v];
	 	a[num].to=u;
	 	head[v]=num;
	 }
	for(int i=1;i<=n;i++) 
	  cin>>w[i];
	for(int i=1;i<=n;i++)
	{int max1=0,max2=0,s=0;
	 for(int j=head[i];j!=0;j=a[j].next)
	  {
		if(w[a[j].to]>max1) 
		{
		 max2=max1;
		 max1=w[a[j].to];	
		}
		 else if(w[a[j].to]>max2) 
		   max2=w[a[j].to];
		  sum=(sum+s*w[a[j].to])%10007;
		  s=(s+w[a[j].to])%10007;
	      max5=max(max5,max1*max2);
	  }
    }
    sum=(2*sum)%10007; 
	cout<<max5<<" "<<sum;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42198700/article/details/82950823