1 solutions
-
0
C++ :
#include <cstdio> #define maxn 200005LL #define maxe 400010LL #define ansmod 10007LL //typedef long long ll ; int n ; struct FST{ int to , next ; } e[maxe] ; int tot = 0 , star[maxn] = {0} ; void AddEdge(int u , int v) { tot ++ ; e[tot].to = v ; e[tot].next = star[u] ; star[u] = tot ; } int ans = 0 ; int ans2 = 0 ; int val[maxn] = {0} ;/*每个节点原权值*/ int sum[maxn] = {0} ;/*每个节点的儿子节点权值和*/ int maxx[maxn] = {0} ;/*每个节点中第一大儿子节点权值*/ void dfs(int now , int fa) { int next , p ; for (p=star[now] , next=e[p].to ; p ; p=e[p].next , next=e[p].to) { if (next == fa) continue ; ans += (val[next]*sum[now])%ansmod ; ans %= ansmod ; sum[now] += val[next] ; sum[now] %= ansmod ; if (val[next]*maxx[now] > ans2) ans2 = val[next]*maxx[now] ; if (val[next] > maxx[now]) maxx[now] = val[next] ; dfs(next , now) ; ans += (val[now]*sum[next])%ansmod ; ans %= ansmod ; if (val[now]*maxx[next] > ans2) ans2 = val[now]*maxx[next] ; } } int main() { // freopen("link.in" ,"r",stdin ) ; // freopen("link.out","w",stdout) ; int i , u , v ; scanf("%d", &n ) ; for (i = 1 ; i < n ; i ++ ) { scanf("%d%d", &u , &v ) ; AddEdge(u , v) ; AddEdge(v , u) ; } for (i = 1 ; i <= n ; i ++ ) { scanf("%d", &val[i] ) ; } dfs(1,0) ; printf("%d %d\n", ans2 , (ans*2)%ansmod ) ; fclose(stdin ) ; fclose(stdout) ; return 0 ; }
- 1
Information
- ID
- 18073
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By