当前位置:   article > 正文

LeetCode_802找到最终的安全状态(dfs)_leetcode 802

leetcode 802

题目链接:https://leetcode-cn.com/problems/find-eventual-safe-states/description/

        本题大意就是找出所有不与环连通的结点。不安全状态有两种情况:1、这个点在一个环中。2、这个点顺着边递推,会走到一个环里。所以本题的思路是给点设置三种状态,初始时的0表示未访问过的点;1表示这个点是不安全的,即这个点连接着一个环或就在环中;2表示这个点是安全的,不与任何环连通。然后对每个点进行深度优先搜索,若遇到了不安全的点,那么这个点也是不安全的,置为2。若遇到了安全的点,则表示已经有了一条可以通向终点的路径,那么这个点也是安全的,置为2。代码如下:

  1. class Solution {
  2. public:
  3. bool dfs(int i,vector<int>& color,vector<vector<int> >& gra)
  4. {
  5. //若这个点为0,则进行下面的访问操作,否则返回这个点的状态
  6. if(color[i])
  7. return color[i]==2;
  8. //在未到达终点前,所有点都是不安全的。
  9. color[i]=1;
  10. //深度优先搜索
  11. for(int j=0;j<gra[i].size();j++)
  12. {
  13. //若下个点是不安全的则返回false,且不会将这个点的状态该为2,表示这个点不安全。
  14. if(color[gra[i][j]]==1 || !dfs(gra[i][j],color,gra))
  15. return false;
  16. }
  17. //若走到了终点,则给他置为2,且返回true
  18. color[i]=2;
  19. return true;
  20. }
  21. vector<int> eventualSafeNodes(vector<vector<int> >& graph) {
  22. int n=graph.size();
  23. vector<int> res;
  24. vector<int> color(n,0);
  25. //对每个点进行搜索,将安全的点加入结果集中
  26. for(int i=0;i<n;i++)
  27. if(dfs(i,color,graph))
  28. res.push_back(i);
  29. return res;
  30. }
  31. };

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/995246
推荐阅读
相关标签
  

闽ICP备14008679号