hihoCoder 1050 树中的最长路 题解
2018-01-23 22:42
330 查看
题目大意:
题目描述又臭又长,但是几段比较关键的话说明了这是一个有向无环图,共有n个点,n-1条边,现在要求这个图中的最长的一个路径。
分析:
实际上这样的图结构就是树,而树中的最长路就是树的直径,只要选择树中任意一点进行BFS寻找到最远点a,然后从a点进行BFS寻找到最远远点b,这样a到b就是这个树的直径,长度最远。
源代码:
题目描述又臭又长,但是几段比较关键的话说明了这是一个有向无环图,共有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()); } } }
相关文章推荐
- hihocoder-1050 树中的最长路(dfs)
- hihocoder1050 : 树中的最长路
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
- Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
- 分治 hihoCoder1050 树中的最长路
- hihocoder#1050之树中最长路
- hihoCoder1050— 树中的最长路(深搜)
- hihocoder#1050之树中最长路
- [hihocoder1050]树中的最长路
- 第七周:[hihocoder]#1050 : 树中的最长路
- hihoCoder 1050 树中的最长路
- [hihocoder 1050]求树的最长链
- 树的直径(图中最长路)——hiho 1050
- #1050 :求多叉树中的的最长路
- hihocoder-第十一周 树中的最长路
- #1050 : 树中的最长路(树的直径)
- HihoCoder #1050 树中的最长路
- #1050 : 树中的最长路(两次BFS)
- 树中的最长路(hihocoder 第十一周)
- hihocoder(1050) 树中最长路径