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

Python에서 수락 된 초대 수를 찾는 프로그램

<시간/>

m명의 소년과 n명의 소녀가 있고 m =n이 있다고 가정합니다. 파티가 시작되고 각 소년은 소녀와 함께 그 파티에 가야 합니다. 따라서 소년은 모든 소녀를 초대하고 소녀는 하나의 초대만 수락할 수 있습니다. 우리는 소녀들이 수락할 수 있는 소년들의 총 초대 수를 찾아야 합니다. 입력은 m x n 행렬로 제공되며, 여기서 각 셀 위치 i, j는 소년 i가 소녀 j에게 편지를 보냈는지 여부를 나타냅니다. 셀이 1이면 초대장이 전송되었음을 의미하고 0이면 초대장이 전송되지 않았음을 의미합니다.

따라서 입력이 다음과 같으면

1 0 0
1 0 1
1 1 0

그러면 출력은 3이 됩니다.

인 경우 출력은 3이 됩니다.

소녀 1이 소년 1의 초대를 수락합니다.

소녀 2가 소년 3의 초대를 수락합니다.

소녀 3이 소년 2의 초대를 수락합니다.

(여기서 인덱스는 1부터 시작)

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

  • dfs() 함수를 정의합니다. 이것은 노드가 필요합니다. 본
    • 0 ~ N 범위의 nei에 대해
      • 그리드[노드][nei]가 0이 아니고 본[nei]가 False이면
        • 본[nei] :=사실입니다
        • matching[nei]가 -1과 같거나 dfs(matching[nei], see)가 True이면
          • 매칭[nei] :=노드
          • 참 반환
    • 거짓을 반환
  • M:=그리드의 행 수
  • N :=그리드의 열 개수
  • 일치:=값 -1을 포함하는 크기 N의 목록
  • res :=0
  • 0~M 범위의 i에 대해
    • seen :=False 값을 포함하는 크기 N의 목록
    • dfs(i, see)가 True이면
      • 반환 결과
  • 반환 결과

예시

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

def solve(grid):
   M, N = len(grid), len(grid[0])
   matching = [-1] * N

   def dfs(node, seen):
      for nei in range(N):
         if grid[node][nei] and not seen[nei]:
            seen[nei] = True
            if matching[nei] == -1 or dfs(matching[nei], seen):
               matching[nei] = node
               return True
      return False

   res = 0
   for i in range(M):
      seen = [False] * N
      if dfs(i, seen):
         res += 1

   return res

print(solve([[1, 0, 0], [1, 0, 1], [1, 1, 0]]))

입력

[[1, 0, 0], [1, 0, 1], [1, 1, 0]]

출력

3