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

파이썬에서 적이 같은 그룹에 머물 수 없는 사람을 분리하는 프로그램

<시간/>

숫자 n과 적이라는 2D 행렬이 있다고 가정합니다. 여기서 n은 [0, n - 1]에서 레이블이 지정된 n명의 사람들이 있음을 나타냅니다. 이제 적의 각 행에는 [a, b]가 포함되며, 이는 및 b가 적임을 의미합니다. 같은 그룹에 적이 되는 두 사람이 없도록 n명을 두 그룹으로 나누는 것이 가능한지 확인해야 합니다.

따라서 입력이 n =4, 적수 =[[0, 3],[3, 2]]인 경우 이 두 그룹 [0, 1, 2] 및 [ 3].

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

  • 그래프 :=빈 인접 목록

  • 적의 각 적 쌍(u, v)에 대해 수행

    • 그래프 끝에 v 삽입[u]

    • 그래프 끝에 u 삽입[v]

  • 색상 :=새 지도

  • dfs() 함수를 정의합니다. 처음에는 u, c :=0이 필요합니다.

  • u가 색상이면

    • color[u]가 c

      와 같으면 true를 반환합니다.
  • 색상[u] :=c

  • 그래프[u]의 각 v에 대한 모든 dfs(v, c XOR 1)가 참일 때 참을 반환

  • 주요 방법에서 다음을 수행하십시오 -

  • 0에서 n 사이의 각 u에 대한 모든 (dfs(u) 및 u가 색상이 아닌 경우) 참일 때 참을 반환합니다.

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

예시

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