[noip] 2014複賽提高組day1 聯合權值
阿新 • • 發佈:2018-12-13
本蒟蒻自己想的方法,非常好,哈哈哈哈哈哈哈
#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; }