这题的意思是从每个节点出发,进行dfs,然后找出连通的结点中quiet值最小的那个点,这题采用记忆化搜索,对于每次dfs,返回当前节点及之后节点中quiet值最小的那个节点的编号。若已经访问过,则直接返回ans中的值。
代码:
class Solution {
public:
int g[505][505];
int vis[505];
int dfs(vector<vector<int>>& richer, vector<int>&quiet,vector<int>&ans,int v){
if(vis[v])
return ans[v];
vis[v]=1;
int tmp=v; //记录从当前节点开始搜索,quiet值最小的结点编号,初始为自己
for(int i=0;i<quiet.size();i++){
if(g[v][i]){
int q=dfs(richer,quiet,ans,i);
if(quiet[q]<quiet[tmp])
tmp=q;
}
}
ans[v]=tmp; //更新答案
return tmp;
}
vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
int size=quiet.size();
for(auto e:richer)
g[e[1]][e[0]]=1;
vector<int>ans(size,0);
for(int i=0;i<size;i++)
dfs(richer,quiet,ans,i);
return ans;
}
};