OPTADS360
ATNETWORK
RANDOM
ON
YOMEDIA
Banner-Video
IN_IMAGE

Hãy thực thi thuật toán Dijkstra bằng Python?

  bởi Bảo Anh 26/11/2021
AMBIENT-ADSENSE/lession_isads=0
QUẢNG CÁO
 

Câu trả lời (1)

  • Thuật toán cơ bản

    Từ mỗi đỉnh chưa đi qua, hãy chọn đỉnh với khoảng cách nhỏ nhất và đi tới điểm đó.

    Cập nhật khoảng cách cho mỗi đỉnh lân cận, của các đỉnh đã đi qua mà khoảng cách hiện hành lớn hơn tổng của nó, và trọng số của cạnh giữa 2 đỉnh.

    Lập lại bước 1 và 2 cho đến khi tất cả các đỉnh được đi qua.

    import sys
    # Function to find out which of the unvisited node 
    # needs to be visited next
    def to_be_visited():
      global visited_and_distance
      v = -10
      # Choosing the vertex with the minimum distance
      for index in range(number_of_vertices):
        if visited_and_distance[index][0] == 0 \
          and (v < 0 or visited_and_distance[index][1] <= \
          visited_and_distance[v][1]):
            v = index
      return v
    # Creating the graph as an adjacency matrix
    vertices = [[0, 1, 1, 0],
                [0, 0, 1, 0],
                [0, 0, 0, 1],
                [0, 0, 0, 0]]
    edges =  [[0, 3, 4, 0],
              [0, 0, 0.5, 0],
              [0, 0, 0, 1],
              [0, 0, 0, 0]]
    
    number_of_vertices = len(vertices[0])
    # The first element of the lists inside visited_and_distance 
    # denotes if the vertex has been visited.
    # The second element of the lists inside the visited_and_distance 
    # denotes the distance from the source.
    visited_and_distance = [[0, 0]]
    for i in range(number_of_vertices-1):
      visited_and_distance.append([0, sys.maxsize])
    for vertex in range(number_of_vertices):
      # Finding the next vertex to be visited.
      to_visit = to_be_visited()
      for neighbor_index in range(number_of_vertices):
        # Calculating the new distance for all unvisited neighbours
        # of the chosen vertex.
        if vertices[to_visit][neighbor_index] == 1 and \
         visited_and_distance[neighbor_index][0] == 0:
          new_distance = visited_and_distance[to_visit][1] \
          + edges[to_visit][neighbor_index]
          # Updating the distance of the neighbor if its current distance
          # is greater than the distance that has just been calculated
          if visited_and_distance[neighbor_index][1] > new_distance:
            visited_and_distance[neighbor_index][1] = new_distance
        # Visiting the vertex found earlier
        visited_and_distance[to_visit][0] = 1
    
    i = 0 
    # Printing out the shortest distance from the source to each vertex       
    for distance in visited_and_distance:
      print("The shortest distance of ",chr(ord('a') + i),\
      " from the source vertex a is:",distance[1])
      i = i + 1
    

    Dưới đây là đoạn mã thực hiện thuật toán trên

    Output:

    The shortest distance of a from the source vertex a is: 0

    The shortest distance of b from the source vertex a is: 3

    The shortest distance of c from the source vertex a is: 3.5

    The shortest distance of d from the source vertex a is: 4.5

      bởi Nguyễn Thanh Trà 26/11/2021
    Like (0) Báo cáo sai phạm

Nếu bạn hỏi, bạn chỉ thu về một câu trả lời.
Nhưng khi bạn suy nghĩ trả lời, bạn sẽ thu về gấp bội!

Lưu ý: Các trường hợp cố tình spam câu trả lời hoặc bị báo xấu trên 5 lần sẽ bị khóa tài khoản

Gửi câu trả lời Hủy
 
 

Các câu hỏi mới

NONE
OFF