Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 포식자가 없는 동물의 최소 수를 세는 프로그램

<시간/>

nums[i]가 i번째 동물의 포식자를 표시하고 포식자가 없으면 -1을 유지하는 nums라는 숫자 목록이 있다고 가정합니다. 직간접적인 포식자와 같은 그룹에 동물이 포함되지 않도록 가장 작은 수의 동물 그룹을 찾아야 합니다.

따라서 입력이 nums =[1, 2, −1, 4, 5, −1]과 같으면 출력은 [0, 3], [1, 4]와 같은 그룹을 가질 수 있으므로 3이 됩니다. ], [2, 5].

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • A가 비어 있으면

    • 0 반환

  • adj :=빈 지도

  • vis :=새로운 세트

  • 루트 :=새 목록

  • 각 인덱스 i와 A의 값에 대해 수행

    • a가 -1과 같으면

      • 루트 끝에 i 삽입

    • adj[i]

      끝에 삽입
    • adj[a]

      끝에 i 삽입
  • 최고 :=−무한대

  • 루트의 각 루트에 대해 수행

    • stk :=스택에 [루트, 1]을 삽입

    • stk가 비어 있지 않은 동안 수행

      • (노드, d) :=stk의 팝된 요소

      • 노드가 vis에 있거나 노드가 -1과 같으면

        • 루프에서 나오다

      • 최고 :=최고 및 d의 최대값

      • vis에 노드 삽입

      • adj[node]의 각 u에 대해 수행

        • (u, d + 1)을 stk로 푸시

  • 최고의 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

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))

입력

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

출력

3