# 2277. Closest Node to Path in Tree
###### tags: `Leetcode` `Hard` `DFS` `BFS`
Link: https://leetcode.com/problems/closest-node-to-path-in-tree/description/
## 思路
先把每个点当起点 算每两个点之间的最短路径
然后对于每个query做dfs, 对于能够通往end的这个分支上的节点, 取dist最小的node
## Code
```java=
class Solution {
int minNode;
public int[] closestNode(int n, int[][] edges, int[][] query) {
int[][] dist = new int[n][n];
List<List<Integer>> graph = new ArrayList<>();
for(int i=0; i<n; i++) graph.add(new ArrayList<>());
for(int[] edge:edges){
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]);
}
for(int i=0; i<n; i++){
Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[n];
q.add(i);
visited[i] = true;
int d = 0;
while(!q.isEmpty()){
int size = q.size();
for(int j=0; j<size; j++){
int curr = q.poll();
dist[i][curr] = d;
for(int next:graph.get(curr)){
if(!visited[next]){
visited[next] = true;
q.add(next);
}
}
}
d++;
}
}
int[] ans = new int[query.length];
for(int i=0; i<query.length; i++){
int[] q = query[i];
int s = q[0], e = q[1], node = q[2];
minNode = s;
boolean[] visited = new boolean[n];
visited[s] = true;
dfs(s, e, node, graph, dist, visited);
ans[i] = minNode;
}
return ans;
}
private boolean dfs(int s, int e, int node, List<List<Integer>> graph, int[][] dist, boolean[] visited){
if(s==e) return true;
for(int next:graph.get(s)){
if(visited[next]) continue;
visited[next] = true;
if(dfs(next, e, node, graph, dist, visited)){
if(dist[minNode][node]>dist[next][node]){
minNode = next;
}
return true;
}
}
return false;
}
}
```