题目连接:851. Loud and Rich
解题思路:
1.构建邻接表,从起点开始构造,后面的结点都比它富有,并记录富结点的入度
2.以最穷的点为起点深搜(即入度为0的结点,递归求所有比他富的结点最安静的值)
3.截肢:搜索完成的结点可以直接使用,用v来记录
class Solution {
List<List<Integer>> edges = new ArrayList<>();
int d[];
boolean v[];
int ans[];
public int[] loudAndRich(int[][] richer, int[] quiet) {
int n = quiet.length;
d = new int[n];
ans = new int[n];
v = new boolean[n];
for(int i = 0; i< n;++i){
edges.add(new ArrayList<Integer>());
}
for(int a[]:richer){
edges.get(a[1]).add(a[0]);
++d[a[0]];
}
for(int i = 0; i< n; ++i){
if(d[i] == 0){
dfs(i, quiet);
}
}
return ans;
}
private int dfs(int u, int[] quiet) {
if(v[u]){//如果已经求过了
return ans[u];
}
int min = u;//当前结点的安静度
for(int v : edges.get(u)){
int t = dfs(v, quiet);//相邻结点子树下最安静的
if(quiet[t] < quiet[min]) min =t;
}
v[u] = true;
ans[u] = min;
return min;
}
}