您的位置:首页 > 其它

hihoCoder 1050 树中的最长路 题解

2018-01-23 22:42 330 查看
题目大意:

    题目描述又臭又长,但是几段比较关键的话说明了这是一个有向无环图,共有n个点,n-1条边,现在要求这个图中的最长的一个路径。

分析:

    实际上这样的图结构就是树,而树中的最长路就是树的直径,只要选择树中任意一点进行BFS寻找到最远点a,然后从a点进行BFS寻找到最远远点b,这样a到b就是这个树的直径,长度最远。

源代码:

import java.io.*;
import java.util.*;
public class Main {
static final int maxn = 100005;
static int n, u, v;
static int[] dist = new int[maxn];
static boolean[] vis = new boolean[maxn];
static ArrayList<ArrayList<Integer>> G = new ArrayList<ArrayList<Integer>>();
static ArrayDeque<Integer> que = new ArrayDeque<Integer>();
public static int bfs(int s) {
que.clear();
Arrays.fill(vis, false);
Arrays.fill(dist, Integer.MAX_VALUE);
que.addLast(s);
vis[s] = true;
dist[s] = 0;
while(!que.isEmpty()) {
int u = que.pollFirst();
ArrayList<Integer> temp = G.get(u);
for(int i = 0; i < temp.size(); i++) {
int v = temp.get(i);
if(!vis[v]) {
vis[v] = true;
dist[v] = dist[u] + 1;
que.addLast(v);
}
}
}
int ans = dist[1], index = 1;
for(int i = 2; i <= n; i++) {
if(dist[i] > ans) {
index = i;
ans = dist[i];
}
}
return index;
}
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
for(int i = 0; i < maxn; i++) {
G.add(new ArrayList<Integer>());
}
n = in.nextInt();
for(int i = 1; i <= n - 1; i++) {
u = in.nextInt();
v = in.nextInt();
(G.get(u)).add(v);
(G.get(v)).add(u);
}
int a = bfs(1);
int b = bfs(a);
out.println(dist[b]);
out.close();
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while(tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: