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

Python의 모든 다른 과정을 다루기 위해 최소 학기를 계산하는 프로그램

<시간/>

숫자 n이 있다고 가정하고 1에서 n까지 레이블이 지정된 n개의 다른 코스가 있음을 나타냅니다. 우리는 또한 관계[i]가 한 쌍(prevCourse_i, nextCourse_i)을 포함하는 관계라는 배열을 가지고 있습니다. 이는 prevCourse_i 과정과 nextCourse_i 과정 사이의 전제 관계를 나타냅니다. 따라서 prevCourse_i 과정은 nextCourse_i 과정보다 먼저 수강해야 합니다. 그리고 우리가 가지고 있는 마지막 매개변수는 k입니다. 한 학기에 수강하는 과목에 대해 이전 학기에 모든 선수 과목을 이수했다면 최대 k 과목을 수강할 수 있습니다. 모든 과정을 수강하는 데 필요한 최소 학기 수를 찾아야 합니다.

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

Python의 모든 다른 과정을 다루기 위해 최소 학기를 계산하는 프로그램

첫 번째 학기에는 과정 1과 2를 들을 수 있기 때문에 출력은 3이 될 것입니다. 이제 우리는 과정 3, 4, 5에 적격하므로 두 번째 학기에 5와 3 또는 4 중 하나를 선택하면 다음 학기에 모든 과정을 마칠 수 있습니다. 따라서 총 3학기가 필요합니다.

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

  • 촬영:=새로운 세트

  • g1 :=n개의 빈 목록이 있는 목록

  • g2 :=크기가 n이고 0으로 채워진 새 목록

  • w :=크기가 n이고 0으로 채워지는 새 목록

  • 학기 :=0

  • 관계의 각 x에 대해 수행

    • g1[x[1]-1]

      끝에 x[0]-1 삽입
    • g2[x[0]-1]

      끝에 x[1]-1 삽입
  • weight :=g1에 있는 모든 항목의 길이에서 새 목록

  • 범위 0에서 n - 1에 있는 i에 대해 수행

    • g1[i]의 각 x에 대해 수행

      • w[x] :=w[x]와 weight[i]의 최대값

  • 의 크기가

    • 코스 :=새 목록

    • 범위 0에서 n - 1에 있는 i에 대해 수행

      • g1[i]가 비어 있고 i가 취해지지 않은 경우

        • 코스 끝에 (i, w[i]) 삽입

      • 코스의 크기> k인 경우

        • 코스 =두 번째 매개변수를 기준으로 코스를 역순으로 정렬

        • 코스 :=처음 k 코스 목록

      • 학기 :=학기 + 1

      • 과정의 각 x에 대해 수행

        • g2[x[0]]의 각 y에 대해 수행

          • g1[y]에서 x[0] 삭제

        • g2[x[0]] :=빈 목록

        • x[0] 삽입

  • 반환 학기

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

def solve(n, relations, k):
   taken = set()
   g1 = [[] for _ in range(n)]
   g2 = [[] for _ in range(n)]
   w = [0] * n
   semester = 0
   for x in relations:
      g1[x[1]-1].append(x[0]-1)
      g2[x[0]-1].append(x[1]-1)

   weight = list(map(len, g1))
   for i in range(n):
      for x in g1[i]:
         w[x] = max(w[x], weight[i])


   while len(taken) < n:
      courses = []
      for i in range(n):
         if (not g1[i]) and (i not in taken):
            courses.append([i,w[i]])
      if len(courses) > k:
         courses = sorted(courses, key = lambda x:x[1],reverse=True)
         courses = courses[:k]

      semester += 1

      for x in courses:
         for y in g2[x[0]]:
            g1[y].remove(x[0])
         g2[x[0]] = []
         taken.add(x[0])
   return semester

n = 6
relations = [(1,3),(2,5),(2,4),(5,6)]
k = 2
print(solve(n, relations, k))

입력

6, [(1,3),(2,5),(2,4),(5,6)], 2

출력

3