首先挂上题目链接~http://lx.lanqiao.cn/problem.page?gpid=T32
分析:题目是求所有结点中某两个结点之间的距离最大值,这其中有个定理:先用dfs求出某个结点到其他结点的距离最大值,并保存那个结点。然后以那个结点为起点再一次dfs就能求出距离最大值了。(我不会证明,只会这么用,逃~
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.LinkedList;
class Node12{
LinkedList<Integer> len = new LinkedList<>();//一定要调用构造函数初始化!!!Java的特点
LinkedList<Integer> child = new LinkedList<>();
};
public class Main {
static int dmax,n,maxn=10010,s1;
static boolean[] vis;
static Node12[] node = new Node12[maxn];
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
n = (int)in.nval;
for(int i = 0; i<=n; i++)
node[i] = new Node12();
Integer u,v,w;
for(int i = 0; i<n-1; i++){
in.nextToken();
u = (int)in.nval;
in.nextToken();
v = (int)in.nval;
in.nextToken();
w = (int)in.nval;
node[u].child.add(v);
node[u].len.add(w);
node[v].child.add(u);
node[v].len.add(w);
}
//两次dfs
vis = new boolean[n+1];
dfs(1, 0);
vis = new boolean[n+1];
dfs(s1, 0);
int res = (21+dmax)*dmax/2;
out.print(res);
out.flush();
}
private static void dfs(int cur, int d) {
vis[cur] = true;
if(d>dmax) {
s1 = cur;
dmax = d;
}
for(int i = 0; i<node[cur].child.size(); i++){
int tem = node[cur].child.get(i);
if(!vis[tem]){
dfs(tem, d+node[cur].len.get(i));
vis[tem] = false;
}
}
}
}