team2012-E1-mysol-0006
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
/* 解题报告 //
给出一棵树,树的权值定义为所有节点权值之和,如果砍掉一个点
则这棵树会分离成好几棵树,其价值为每棵树的权值之积
问砍哪个点,可以使得到的价值最大
算法没什么难的,先 dfs 求出每棵子树的权值之和,再枚举砍的点计算价值
关键是大整数的处理,可以拍 C++ 的大整数模板,也可以用 java
// By 猛犸也钻地 @ 2012.07.19 */
}}}
{{{
import java.io.*;
import java.util.*;
import java.math.*;
public class Summer0006 {
static int SIZE = 100000;
static int[] w = new int[SIZE];
static int[] s = new int[SIZE];
static ArrayList<Integer>[] e = new ArrayList[SIZE];
public static void gao(int x, int src) {
s[x] = w[x];
for(int y : e[x]) {
if(y == src) continue;
gao(y, x);
s[x] += s[y];
}
}
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
int n = Integer.parseInt(br.readLine()), sum = 0;
StringTokenizer t = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
w[i] = Integer.parseInt(t.nextToken());
e[i] = new ArrayList<Integer>();
sum += w[i];
}
for(int i = 1; i < n; i++) {
t = new StringTokenizer(br.readLine());
int x = Integer.parseInt(t.nextToken()) - 1;
int y = Integer.parseInt(t.nextToken()) - 1;
e[x].add(y);
e[y].add(x);
}
gao(0, -1);
BigInteger ans = BigInteger.ONE;
for(int x = 0; x < n; x++) {
BigInteger mul = BigInteger.ONE;
for(int y : e[x]) {
if(s[y] > s[x]) {
mul = mul.multiply(BigInteger.valueOf(sum - s[x]));
} else {
mul = mul.multiply(BigInteger.valueOf(s[y]));
}
}
if(mul.compareTo(ans) > 0) {
ans = mul;
}
}
System.out.println(ans);
br.readLine();
} catch(Exception e) {
break;
}
}
}
}
}}}
/* 解题报告 //
给出一棵树,树的权值定义为所有节点权值之和,如果砍掉一个点
则这棵树会分离成好几棵树,其价值为每棵树的权值之积
问砍哪个点,可以使得到的价值最大
算法没什么难的,先 dfs 求出每棵子树的权值之和,再枚举砍的点计算价值
关键是大整数的处理,可以拍 C++ 的大整数模板,也可以用 java
// By 猛犸也钻地 @ 2012.07.19 */
import java.io.*;
import java.util.*;
import java.math.*;
public class Summer0006 {
static int SIZE = 100000;
static int[] w = new int[SIZE];
static int[] s = new int[SIZE];
static ArrayList<Integer>[] e = new ArrayList[SIZE];
public static void gao(int x, int src) {
s[x] = w[x];
for(int y : e[x]) {
if(y == src) continue;
gao(y, x);
s[x] += s[y];
}
}
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
int n = Integer.parseInt(br.readLine()), sum = 0;
StringTokenizer t = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
w[i] = Integer.parseInt(t.nextToken());
e[i] = new ArrayList<Integer>();
sum += w[i];
}
for(int i = 1; i < n; i++) {
t = new StringTokenizer(br.readLine());
int x = Integer.parseInt(t.nextToken()) - 1;
int y = Integer.parseInt(t.nextToken()) - 1;
e[x].add(y);
e[y].add(x);
}
gao(0, -1);
BigInteger ans = BigInteger.ONE;
for(int x = 0; x < n; x++) {
BigInteger mul = BigInteger.ONE;
for(int y : e[x]) {
if(s[y] > s[x]) {
mul = mul.multiply(BigInteger.valueOf(sum - s[x]));
} else {
mul = mul.multiply(BigInteger.valueOf(s[y]));
}
}
if(mul.compareTo(ans) > 0) {
ans = mul;
}
}
System.out.println(ans);
br.readLine();
} catch(Exception e) {
break;
}
}
}
}