-
Notifications
You must be signed in to change notification settings - Fork 157
Expand file tree
/
Copy path0785_is_graph_bipartite_(medium).js
More file actions
131 lines (116 loc) · 2.65 KB
/
Copy path0785_is_graph_bipartite_(medium).js
File metadata and controls
131 lines (116 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* 785. Is Graph Bipartite?
*
* https://leetcode.com/problems/is-graph-bipartite/
*
* Given an undirected graph, return true if and only if it is bipartite.
*
* Recall that a graph is bipartite if we can split it's set of nodes into two
* independent subsets A and B such that every edge in the graph has one node in
* A and another node in B.
*
* The graph is given in the following form: graph[i] is a list of indexes j for
* which the edge between nodes i and j exists. Each node is an integer between
* 0 and graph.length - 1. There are no self edges or parallel edges: graph[i]
* does not contain i, and it doesn't contain any element twice.
*
* Example 1:
*
* Input: [[1,3], [0,2], [1,3], [0,2]]
* Output: true
*
* Explanation:
*
* The graph looks like this:
*
* 0----1
* | |
* | |
* 3----2
*
* We can divide the vertices into two groups: {0, 2} and {1, 3}.
*
* Example 2:
*
* Input: [[1,2,3], [0,2], [0,1,3], [0,2]]
* Output: false
*
* Explanation:
*
* The graph looks like this:
*
* 0----1
* | \ |
* | \ |
* 3----2
*
* We cannot find a way to divide the set of nodes into two independent subsets.
*
* Note:
*
* graph will have length in range [1, 100].
* graph[i] will contain integers in range [0, graph.length - 1].
* graph[i] will not contain i or duplicate values.
* The graph is undirected: if any element j is in graph[i], then i will be in graph[j].
*/
/**
* DFS Solution
*
* @param {number[][]} graph
* @return {boolean}
*/
const isBipartite_DFS = (graph) => {
const colors = new Map();
for (let u = 0; u < graph.length; u++) {
if (!dfs(graph, colors, u, 0)) {
return false;
}
}
return true;
};
const dfs = (graph, colors, u, color) => {
if (!colors.has(u)) {
colors.set(u, color);
for (const v of graph[u]) {
if (!dfs(graph, colors, v, 1 - color) || colors.get(v) === color) {
return false;
}
}
}
return true;
};
/**
* BFS Solution
*
* @param {number[][]} graph
* @return {boolean}
*/
const isBipartite_BFS = (graph) => {
const colors = new Map();
for (let u = 0; u < graph.length; u++) {
if (!bfs(graph, colors, u)) {
return false;
}
}
return true;
};
const bfs = (graph, colors, u) => {
if (!colors.has(u)) {
const queue = [u];
colors.set(u, 0);
while (queue.length > 0) {
u = queue.shift();
for (const v of graph[u]) {
if (colors.get(v) === colors.get(u)) {
return false;
}
if (!colors.has(v)) {
queue.push(v);
colors.set(v, 1 - colors.get(u));
}
}
}
}
return true;
};
export { isBipartite_DFS, isBipartite_BFS };