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

Các khóa học song song bằng Python

Giả sử có N khóa học và chúng được gắn nhãn từ 1 đến N. Chúng tôi cũng đưa ra một mảng quan hệ, trong đó các quan hệ [i] =[X, Y], đại diện cho mối quan hệ tiên quyết giữa khóa học X và khóa Y. Vì vậy, điều này có nghĩa là khóa học X phải được học trước khóa học Y.

Trong một học kỳ, chúng ta có thể học bất kỳ số lượng khóa học nào miễn là chúng ta đã nghiên cứu tất cả các điều kiện tiên quyết của khóa học chúng ta đang học. Chúng tôi phải tìm số học kỳ tối thiểu cần thiết để học tất cả các khóa học. Và nếu không có cách nào để học tất cả các khóa học, hãy trả về -1.

Vì vậy, nếu đầu vào là N =3, quan hệ =[[1,3], [2,3]], thì đầu ra sẽ là 2 như Trong học kỳ đầu tiên, các khóa 1 và 2 đã được học. Học kỳ 2 môn 3.

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

  • các khóa học:=n

  • đã thăm:=một mảng có kích thước n + 1 và điền vào giá trị này bằng false

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

  • graph:=danh sách n + 1 danh sách phụ

  • in_degree:=một mảng có kích thước n + 1 và điền giá trị này bằng 0

  • đối với mỗi tôi trong các mối quan hệ, hãy làm

    • chèn i [1] vào cuối biểu đồ [i [0]]

    • in_degree [i [1]]:=in_degree [i [1]] + 1

  • semeseter:=1

  • đối với tôi trong phạm vi từ 1 đến n + 1, hãy thực hiện

    • nếu in_degree [i] bằng 0 thì

      • chèn tôi vào cuối hàng đợi

      • đã ghé thăm [i]:=True

  • học kỳ:=1

  • khóa học:=các khóa học - kích thước hàng đợi

  • trong khi hàng đợi không trống và các khóa học khác 0, hãy làm

    • current_size:=kích thước của hàng đợi

    • trong khi current_size khác 0, thực hiện

      • current_course:=queue [0]

      • xóa phần tử đầu tiên khỏi hàng đợi

      • current_size:=current_size - 1

      • đối với mỗi i trong biểu đồ [current_course], hãy thực hiện

        • in_degree [i]:=in_degree [i] - 1

        • nếu tôi không được truy cập và in_degree [i] bằng 0, thì

          • các khóa học:=các khóa học - 1

          • chèn tôi vào cuối hàng đợi

          • đã ghé thăm [i]:=True

    • học kỳ:=học kỳ + 1

  • trả lại học kỳ nếu các khóa học bằng 0 nếu không -1

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

Ví dụ

class Solution(object):
   def minimumSemesters(self, n, relations):
      courses = n
      visited = [False for i in range(n+1)]
      queue = []
      graph = [[] for i in range(n+1)]
      in_degree = [0 for i in range(n+1)]
      for i in relations:
         graph[i[0]].append(i[1])
         in_degree[i[1]]+=1
      semeseter = 1
      for i in range(1,n+1):
         if not in_degree[i]:
            queue.append(i)
            visited[i] = True
         semester = 1
         courses -= len(queue)
         while queue and courses:
            current_size = len(queue)
            while current_size:
               current_course = queue[0]
               queue.pop(0)
               current_size-=1
               for i in graph[current_course]:
                  in_degree[i]-=1
                  if not visited[i] and not in_degree[i]:
                     courses-=1
                     queue.append(i)
                  visited[i]=True
            semester+=1
         return semester if not courses else -1

ob = Solution()
print(ob.minimumSemesters(3,[[1,3],[2,3]]))

Đầu vào

3, [[1,3],[2,3]]

Đầu ra

-1