Skip to content

Commit 7cee82f

Browse files
Add files via upload
1 parent 7b2c54d commit 7cee82f

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// 直接采用DFS来做
2+
// memo 记录每个节点的状态
3+
// 0 代表 not visited
4+
// 1 代表 unsafe
5+
// 2 代表 safe
6+
// 3 代表 访问过了,但是目前还不清楚安全与否
7+
8+
// Runtime: 172 ms, faster than 62.12% of C++ online submissions for Find Eventual Safe States.
9+
// Memory Usage: 31.7 MB, less than 100.00% of C++ online submissions for Find Eventual Safe States.
10+
11+
class Solution
12+
{
13+
public:
14+
vector<int> eventualSafeNodes(vector<vector<int>>& outadj)
15+
{
16+
vector<int> res;
17+
int numOfNode = outadj.size();
18+
vector<int> memo(numOfNode, 0);
19+
20+
21+
for (int i = 0; i < numOfNode; ++i)
22+
{
23+
if (dfs(outadj, i, memo))
24+
res.push_back(i);
25+
}
26+
27+
return res;
28+
}
29+
private:
30+
bool dfs(vector<vector<int>>& outadj, int startNode, vector<int>& memo)
31+
{
32+
// 从备忘录中抽取结果
33+
if (memo[startNode] != 0)
34+
{
35+
if (memo[startNode] == 1)
36+
return false;
37+
else if (memo[startNode] == 2)
38+
return true;
39+
else
40+
{
41+
memo[startNode] = 1;
42+
return false;
43+
}
44+
}
45+
46+
// dfs
47+
memo[startNode] = 3;
48+
for (int node : outadj[startNode])
49+
{
50+
if (dfs(outadj, node, memo) == false)
51+
{
52+
memo[startNode] = 1;
53+
return false;
54+
}
55+
}
56+
57+
memo[startNode] = 2;
58+
return true;
59+
}
60+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Runtime: 760 ms, faster than 81.43% of Python3 online submissions for Find Eventual Safe States.
2+
# Memory Usage: 20.5 MB, less than 7.69% of Python3 online submissions for Find Eventual Safe States.
3+
4+
class Solution:
5+
def eventualSafeNodes(self, outadj: List[List[int]]) -> List[int]:
6+
7+
res = []
8+
numOfNode = len(outadj)
9+
memo = [0 for i in range(numOfNode)]
10+
11+
for i in range(numOfNode):
12+
if self.dfs(outadj, i, memo) is True:
13+
res.append(i)
14+
15+
return res
16+
17+
def dfs(self, outadj, startNode, memo):
18+
19+
if memo[startNode] is not 0:
20+
if memo[startNode] is 1:
21+
return False
22+
elif memo[startNode] is 2:
23+
return True
24+
else:
25+
memo[startNode] = 1
26+
return False
27+
28+
memo[startNode] = 3
29+
for node in outadj[startNode]:
30+
if self.dfs(outadj, node, memo) is False:
31+
memo[startNode] = 1
32+
return False
33+
34+
memo[startNode] = 2
35+
return True

0 commit comments

Comments
 (0)