Skip to content

Commit 86a4246

Browse files
Add files via upload
1 parent 9b2f112 commit 86a4246

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed
+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
3+
附上大佬的参考代码
4+
https://leetcode.com/problems/is-graph-bipartite/discuss/115487/Java-Clean-DFS-solution-with-Explanation
5+
6+
u 代表还没有被上色
7+
r 表示红色
8+
b 表示蓝色
9+
*/
10+
11+
// 单纯使用简单的DFS的代码有点超时,还需要再优化一下
12+
// 63 / 78 test cases passed.
13+
class Solution
14+
{
15+
public:
16+
bool isBipartite(vector<vector<int>>& graph)
17+
{
18+
if (graph.size() == 0) return true;
19+
20+
vector<char> memo(graph.size(), 'u');
21+
22+
return safe(graph, memo, 0);
23+
}
24+
private:
25+
bool safe(const vector<vector<int>>& graph, vector<char>& memo, int startIndex)
26+
{
27+
// 递归停止条件
28+
if (startIndex == graph.size()) return true;
29+
30+
if (memo[startIndex] != 'u')
31+
{
32+
for (auto node : graph[startIndex])
33+
{
34+
if (memo[node] == memo[startIndex]) return false;
35+
}
36+
37+
char color = memo[startIndex] == 'b' ? 'r' : 'b';
38+
for (auto node : graph[startIndex])
39+
{
40+
memo[node] = color;
41+
}
42+
43+
return safe(graph, memo, startIndex + 1);
44+
}
45+
else
46+
{
47+
vector<char> tempmemo = memo;
48+
49+
vector<char> colors = {'b', 'r'};
50+
for (char color : colors)
51+
{
52+
memo[startIndex] = color;
53+
54+
bool bad = false;
55+
for (auto node : graph[startIndex])
56+
{
57+
if (memo[node] == memo[startIndex])
58+
{
59+
bad = true;
60+
break;
61+
}
62+
}
63+
64+
if (bad) continue;
65+
66+
char tempcolor = memo[startIndex] == 'b' ? 'r' : 'b';
67+
for (auto node : graph[startIndex])
68+
{
69+
memo[node] = tempcolor;
70+
}
71+
72+
if (safe(graph, memo, startIndex + 1))
73+
return true;
74+
else
75+
memo = tempmemo;
76+
}
77+
78+
memo[startIndex] = 'u';
79+
return false;
80+
}
81+
}
82+
};
83+
84+
// 充分理解题目意思之后的BFS改进代码
85+
// Runtime: 44 ms, faster than 7.69% of C++ online submissions for Is Graph Bipartite?.
86+
// Memory Usage: 11.9 MB, less than 38.46% of C++ online submissions for Is Graph Bipartite?.
87+
class Solution
88+
{
89+
public:
90+
bool isBipartite(vector<vector<int>>& graph)
91+
{
92+
vector<char> memo(graph.size(), 'u');
93+
94+
for (int index = 0; index < memo.size(); ++index)
95+
{
96+
if (memo[index] != 'u') continue;
97+
98+
queue<int> q;
99+
int layer = 1;
100+
q.push(index);
101+
102+
while (!q.empty())
103+
{
104+
for (int i = q.size(); i > 0; --i)
105+
{
106+
int node = q.front();
107+
memo[node] = layer % 2 == 0 ? 'r' : 'b';
108+
q.pop();
109+
110+
for (auto nextNode : graph[node])
111+
{
112+
if (memo[node] == memo[nextNode]) return false;
113+
}
114+
115+
for (auto nextNode : graph[node])
116+
{
117+
if (memo[nextNode] == 'u') q.push(nextNode);
118+
}
119+
}
120+
++layer;
121+
}
122+
}
123+
return true;
124+
}
125+
};

0 commit comments

Comments
 (0)