题解 | #树上最短链#

树上最短链

http://www.nowcoder.com/questionTerminal/4b0fd3cd06dc4a899abf74996796f5c0

import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] priorities = new int[n];
for(int i =0;i<n;i++){
priorities[i] = scanner.nextInt();
}
int[][] graph = new int[n-1][2];
for(int i =0;i<graph.length;i++){
for(int j =0;j<2;j++){
graph[i][j] = scanner.nextInt();
}
}
int res = getRes(graph,priorities);
System.out.println(res);
}
public static int getRes(int[][] graph,int[] priorities){
HashMap<Integer,HashSet<node>> p_map = new HashMap<>();
HashMap<Node,List<node>> maps = new HashMap<>();
ArrayList<node> allNodes = new ArrayList<>();
for(int i = 1;i<=graph.length+1;i++){
allNodes.add(new Node(i));
}
int p_a;
int p_b;
Node a;
Node b;
for(int i = 0;i<graph.length;i++){
a = allNodes.get(graph[i][0]-1);
b = allNodes.get(graph[i][1]-1);
p_a = priorities[graph[i][0]-1];
p_b = priorities[graph[i][1]-1];
p_map.computeIfAbsent(p_a,f->new HashSet<>()).add(a);
p_map.computeIfAbsent(p_b,f->new HashSet<>()).add(b);
maps.computeIfAbsent(a,f->new ArrayList<>()).add(b);
maps.computeIfAbsent(b,f->new ArrayList<>()).add(a);
}
Stack<node> stack = new Stack<>();
int ans = Integer.MAX_VALUE;
int res,cur_step;
Node cur;
res = Integer.MAX_VALUE;
for(HashSet<node> set:p_map.values()){
if(set.size()<2){continue;}
ans = Integer.MAX_VALUE;
for(Node node:set){
node.steps = 0;
stack.add(node);
}
while(!stack.isEmpty()){
cur = stack.pop();
cur_step = cur.steps;
for(Node next:maps.get(cur)){
if(next == cur.before){continue;}
if(next.steps != -1){
ans = cur_step + 1 + next.steps;
break;
}
next.before = cur;
next.steps = cur_step+1;
stack.push(next);
}
cur.steps = -1;
cur.before = null;
if(ans != Integer.MAX_VALUE){
break;
}
}
while(!stack.isEmpty()){
cur = stack.pop();
cur.before = null;
cur.steps = -1;
}
if(ans != Integer.MAX_VALUE){
res = Math.min(res,ans);
}
for(Node node:set){
node.steps = -1;
}
}
return res == Integer.MAX_VALUE?-1:res;
}
static class Node{
int steps = -1;
int index;
Node before = null;
public Node(int index){
this.index = index;
}
}
}</node></node></node></node></node>

全部评论

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
牛客154160166号:9月底还给我发短信,好奇怪,我24届的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务