本来想用bfs的但是只能ac6个点,剩下的提示超时。于是就采用了两遍dfs的方式,用hashmap<key,node>来存无向图,使用used或者hashset保证不往回走,不过这题好像不需要回溯used。
import java.util.*;
/*
* public class Interval {
* int start;
* int end;
* }
*/
public class Solution {
/**
* 树的直径
* @param n int整型 树的节点个数
* @param Tree_edge Interval类一维数组 树的边
* @param Edge_value int整型一维数组 边的权值
* @return int整型
*/
class node{
int num;
int weight;
public node(int num,int weight){
this.num=num;
this.weight=weight;
}
}
Map<Integer,List<node>> map=new HashMap();
boolean []used;
public int solve (int n, Interval[] Tree_edge, int[] Edge_value) {
used=new boolean[n];
//初始化无向图
for(int i=0;i<Tree_edge.length;i++){
if(map.containsKey(Tree_edge[i].start)){
map.get(Tree_edge[i].start).add(new node(Tree_edge[i].end,Edge_value[i]));
}
else{
map.put(Tree_edge[i].start,new ArrayList<node>());
map.get(Tree_edge[i].start).add(new node(Tree_edge[i].end,Edge_value[i]));
}
if(map.containsKey(Tree_edge[i].end)){
map.get(Tree_edge[i].end).add(new node(Tree_edge[i].start,Edge_value[i]));
}
else{
map.put(Tree_edge[i].end,new ArrayList<node>());
map.get(Tree_edge[i].end).add(new node(Tree_edge[i].start,Edge_value[i]));
}
}
node endPoint1=new node(0,0);
node endPoint2=new node(0,0);
//寻找第一个端点
used[0]=true;
dfs(0,0,used,endPoint1);
for(int i=0;i<used.length;i++){
used[i]=false;
}
used[endPoint1.num]=true;
dfs(endPoint1.num,0,used,endPoint2);
return endPoint2.weight;
}
public void dfs(int startPoint,int lastLength,boolean []used,node endP){
List<node> neighbor=map.get(startPoint);
int maxTmp=0;
int j=0;
for(j=0;j<neighbor.size();j++){
if(used[neighbor.get(j).num]==false){
break;
}
}
if(j==neighbor.size()){
if(lastLength>endP.weight){
endP.weight=lastLength;
endP.num=startPoint;
}
return;
}
for(int i=0;i<neighbor.size();i++){
if(used[neighbor.get(i).num]==false){
used[neighbor.get(i).num]=true;
dfs(neighbor.get(i).num,lastLength+neighbor.get(i).weight,used,endP);
used[neighbor.get(i).num]=false;
}
}
}
// public int bfs(int node){
// Set<Integer> set=new HashSet();
// Queue<int[]> q=new LinkedList<>();
// int maxLen=0;
// q.add(new int[]{node,0});
// set.add(node);
// bigSet.add(node);
// while(!q.isEmpty()){
// int size=q.size();
// for(int i=0;i<size;i++){
// int[] key=q.poll();
// HashMap<Integer,Integer> hash=map.get(key[0]);
// for(int round:hash.keySet()){
// int nextPoint=round;
// int nextLength=hash.get(round)+key[1];//保存的距离
// if(!set.contains(nextPoint)){
// q.add(new int[]{nextPoint,nextLength});
// set.add(nextPoint);
// maxLen=Math.max(maxLen,nextLength);
// }
// }
// }
// }
// return maxLen;
// }
}

京公网安备 11010502036488号