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

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

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

class Solution {
public:
	bool dfs(int i,vector<int>& color,vector<vector<int> >& gra)
	{
		//若这个点为0,则进行下面的访问操作,否则返回这个点的状态 
		if(color[i])
			return color[i]==2;
		//在未到达终点前,所有点都是不安全的。 
		color[i]=1;
		//深度优先搜索 
		for(int j=0;j<gra[i].size();j++)
		{
			//若下个点是不安全的则返回false,且不会将这个点的状态该为2,表示这个点不安全。
			if(color[gra[i][j]]==1 || !dfs(gra[i][j],color,gra))
				return false;
		}
		//若走到了终点,则给他置为2,且返回true
		color[i]=2;
		return true;
	}
    vector<int> eventualSafeNodes(vector<vector<int> >& graph) {
    	int n=graph.size();
        vector<int> res;
        vector<int> color(n,0);
        //对每个点进行搜索,将安全的点加入结果集中 
        for(int i=0;i<n;i++)
        	if(dfs(i,color,graph))
        		res.push_back(i);
        return res;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值