提交时间:2022-07-20 11:51:24

运行 ID: 52734

#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; const int N=5e5+10; struct node{ int to,nxt; }edge[N<<1]; int n,a[N],head[N],tot; long long ans; int read(){ register int res=0,w=1; register char ch=getchar(); while(ch<'0'||ch>'9'){ ch=='-'?w=-1:w=w; ch=getchar(); } while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+(ch^48),ch=getchar(); return res*w; } void add(int u,int v){ edge[++tot].to=v; edge[tot].nxt=head[u]; head[u]=tot; } int p[N],cnt; bool dfs(int u,int v,int fa){ if(u==v) return true; for(register int i=head[u];i;i=edge[i].nxt){ int to=edge[i].to; if(to==fa) continue; if(dfs(to,v,u)){ p[++cnt]=v; return true; } } return false; } bool cmp(int x,int y){ return x<y; } long long solve(){ for(register int i=1;i<=cnt;i++) p[i]=a[p[i]]; sort(p+1,p+1+cnt,cmp); long long res=0; for(register int i=1;i<=cnt;i++){ res=(res+p[i]*i)%mod; } return res; } int main(){ n=read(); for(register int i=1;i<=n;i++) a[i]=read(); for(register int i=1;i<n;i++){ int u=read(),v=read(); add(u,v),add(v,u); } for(register int i=1;i<=n;i++){ for(register int j=i+1;j<=n;j++){ memset(p,0,sizeof(p)); if(dfs(i,j,0)) p[++cnt]=i,ans+=solve(); } } printf("%lld\n",ans); return 0; }