-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path0785-is-graph-bipartite.rb
78 lines (64 loc) · 2.26 KB
/
0785-is-graph-bipartite.rb
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
# frozen_string_literal: true
# 785. Is Graph Bipartite?
# https://leetcode.com/problems/is-graph-bipartite
# Medium
=begin
There is an undirected graph with n nodes, where each node is numbered between 0 and n - 1. You are given a 2D array graph, where graph[u] is an array of nodes that node u is adjacent to. More formally, for each v in graph[u], there is an undirected edge between node u and node v. The graph has the following properties:
There are no self-edges (graph[u] does not contain u).
There are no parallel edges (graph[u] does not contain duplicate values).
If v is in graph[u], then u is in graph[v] (the graph is undirected).
The graph may not be connected, meaning there may be two nodes u and v such that there is no path between them.
A graph is bipartite if the nodes can be partitioned into two independent sets A and B such that every edge in the graph connects a node in set A and a node in set B.
Return true if and only if it is bipartite.
Example 1:
Input: graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
Output: false
Explanation: There is no way to partition the nodes into two independent sets such that every edge connects a node in one and a node in the other.
Example 2:
Input: graph = [[1,3],[0,2],[1,3],[0,2]]
Output: true
Explanation: We can partition the nodes into two sets: {0, 2} and {1, 3}.
Constraints:
graph.length == n
1 <= n <= 100
0 <= graph[u].length < n
0 <= graph[u][i] <= n - 1
graph[u] does not contain u.
All the values of graph[u] are unique.
If graph[u] contains v, then graph[v] contains u.
=end
# @param {Integer[][]} graph
# @return {Boolean}
def is_bipartite(graph)
@graph = graph
n = @graph.count
@group = [-1] * n
n.times do |i|
if @group[i] == -1
@group[i] = 0
return false unless dfs(i)
end
end
true
end
def dfs(i)
@graph[i].each do |j|
if @group[j] != -1
return false if @group[j] == @group[i]
else
@group[j] = 1 - @group[i]
return false unless dfs(j)
end
end
true
end
# ********************#
# TEST #
# ********************#
require "test/unit"
class Test_is_bipartite < Test::Unit::TestCase
def test_
assert_equal false, is_bipartite([[1, 2, 3], [0, 2], [0, 1, 3], [0, 2]])
assert_equal true, is_bipartite([[1, 3], [0, 2], [1, 3], [0, 2]])
end
end