Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình đếm số lượng động vật tối thiểu không có động vật ăn thịt bằng Python

Giả sử chúng ta có một danh sách các số được gọi là nums trong đó nums [i] hiển thị động vật ăn thịt của động vật thứ i và nếu không có động vật ăn thịt nào, nó sẽ giữ −1. Chúng ta phải tìm số lượng nhóm động vật nhỏ nhất sao cho không có động vật nào cùng nhóm với động vật ăn thịt trực tiếp hoặc gián tiếp.

Vì vậy, nếu đầu vào là nums =[1, 2, −1, 4, 5, −1], thì đầu ra sẽ là 3, vì chúng ta có thể có các nhóm như:[0, 3], [1, 4 ], [2, 5].

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • nếu A trống, thì

    • trả về 0

  • adj:=một bản đồ trống

  • vis:=một tập hợp mới

  • root:=một danh sách mới

  • đối với mỗi chỉ số i và giá trị a trong A, thực hiện

    • nếu a giống với −1 thì

      • chèn chữ i vào cuối rễ

    • chèn một vào cuối adj [i]

    • chèn tôi vào cuối adj [a]

  • tốt nhất:=−infinity

  • đối với mỗi gốc trong rễ, thực hiện

    • stk:=một ngăn xếp và chèn [root, 1] vào đó

    • trong khi stk không trống, hãy làm

      • (node, d):=popped phần tử của stk

      • nếu nút nằm trong vis hoặc nút giống với −1, thì

        • đi ra từ vòng lặp

      • tốt nhất:=tối đa trong tổng số tốt nhất và d

      • chèn nút vào vis

      • đối với mỗi u trong adj [node], làm

        • push (u, d + 1) vào stk

  • trở lại tốt nhất

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

from collections import defaultdict
class Solution:
   def solve(self, A):
      if not A:
         return 0
      adj = defaultdict(list)
      vis = set()
      roots = []
      for i, a in enumerate(A):
         if a == -1:
            roots.append(i)
         adj[i].append(a)
         adj[a].append(i)
      best = −float("inf")
      for root in roots:
      stk = [(root, 1)]
      while stk:
         node, d = stk.pop()
         if node in vis or node == −1:
            continue
         best = max(best, d)
         vis.add(node)
         for u in adj[node]:
            stk.append((u, d + 1))
   return best
ob = Solution()
nums = [1, 2, −1, 4, 5, −1]
print(ob.solve(nums))

Đầu vào

[1, 2, −1, 4, 5, −1]

Đầu ra

3