สมมติว่าเรามีตัวเลข n และเมทริกซ์ 2 มิติที่เรียกว่าศัตรู ในที่นี้ n บ่งชี้ว่ามี nผู้คนที่ติดป้ายกำกับจาก [0, n - 1] ตอนนี้แต่ละแถวในศัตรูมี [a, b] ซึ่งหมายความว่า a และ b เป็นศัตรู เราต้องตรวจสอบว่าเป็นไปได้หรือไม่ที่จะแบ่งคน n ออกเป็นสองกลุ่ม เพื่อไม่ให้คนสองคนที่เป็นศัตรูอยู่ในกลุ่มเดียวกัน
ดังนั้นหากอินพุตเป็น n =4 ศัตรู =[[0, 3],[3, 2]] ผลลัพธ์จะเป็น True เนื่องจากเราสามารถมีสองกลุ่มนี้ [0, 1, 2] และ [ 3].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กราฟ :=รายการที่อยู่ติดกันที่ว่างเปล่า
-
สำหรับแต่ละคู่ศัตรู (u, v) ในตัวศัตรู ทำ
-
แทรก v ที่ส่วนท้ายของกราฟ[u]
-
ใส่ u ที่ท้ายกราฟ[v]
-
-
สี :=แผนที่ใหม่
-
กำหนดฟังก์ชัน dfs() นี่จะใช้เวลา u, c :=0 เริ่มแรก
-
ถ้าคุณอยู่ในสีแล้วล่ะก็
-
คืนค่าจริงเมื่อ color[u] เหมือนกับ c
-
-
สี[u] :=c
-
คืนค่า จริง เมื่อ dfs(v, c XOR 1) ทั้งหมด สำหรับแต่ละ v ในกราฟ[u] เป็นจริง
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
คืนค่า จริง เมื่อทั้งหมด (dfs(u) สำหรับแต่ละ u ในช่วง 0 ถึง n และหากคุณไม่มีสี) เป็นจริง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, n, enemies): from collections import defaultdict graph = defaultdict(list) for u, v in enemies: graph[u].append(v) graph[v].append(u) color = {} def dfs(u, c=0): if u in color: return color[u] == c color[u] = c return all(dfs(v, c ^ 1) for v in graph[u]) return all(dfs(u) for u in range(n) if u not in color) ob = Solution() n = 4 enemies = [[0, 3],[3, 2]] print(ob.solve(n, enemies))
อินพุต
4, [[0, 3],[3, 2]]
ผลลัพธ์
True