题解 | #树上最短链#

树上最短链

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>

全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务