Sự khác biệt giữa thuật toán của Prim và Dijkstra?


91

Sự khác biệt chính xác giữa các thuật toán của Dijkstra và Prim là gì? Tôi biết Prim's sẽ cung cấp MST nhưng cây do Dijkstra tạo ra cũng sẽ là MST. Sau đó, sự khác biệt chính xác là gì?


3
Đó là Dijkstra. "ij" là một nguyên âm kép (nguyên âm lượn) trong tiếng Hà Lan, và đó là nơi duy nhất mà "j" không phải là phụ âm.

22
bất kỳ cách nào bạn nhận được câu hỏi.
anuj pradhan

4
Cách tốt nhất để phân biệt sự khác biệt của chúng là đọc một số mã nguồn , DijkstraPrim . Sự khác biệt chính là ở đây: cho Prim graph[u][v] < key[v]và cho Dijkstra dist[u]+graph[u][v] < dist[v]. Vì vậy, như bạn có thể thấy từ các biểu đồ trong hai trang đó, chúng khác nhau chủ yếu là do hai dòng mã này.
JW.ZG

Có thể có bản sao của thuật toán Dijkstra và Prim là gì?
e4c5

Câu trả lời:


146

Thuật toán của Prim xây dựng một cây bao trùm tối thiểu cho biểu đồ, là cây kết nối tất cả các nút trong biểu đồ và có tổng chi phí thấp nhất trong số tất cả các cây kết nối tất cả các nút. Tuy nhiên, độ dài của đường dẫn giữa hai nút bất kỳ trong MST có thể không phải là đường đi ngắn nhất giữa hai nút đó trong biểu đồ ban đầu. MST rất hữu ích, chẳng hạn, nếu bạn muốn kết nối vật lý các nút trong biểu đồ để cung cấp điện cho chúng với tổng chi phí ít nhất. Không quan trọng là độ dài đường dẫn giữa hai nút có thể không tối ưu, vì tất cả những gì bạn quan tâm là thực tế là chúng được kết nối với nhau.

Thuật toán Dijkstra xây dựng một cây đường dẫn ngắn nhất bắt đầu từ một số nút nguồn. Cây đường dẫn ngắn nhất là cây kết nối tất cả các nút trong biểu đồ trở lại nút nguồn và có thuộc tính là độ dài của bất kỳ đường dẫn nào từ nút nguồn đến bất kỳ nút nào khác trong biểu đồ đều được giảm thiểu. Điều này rất hữu ích, chẳng hạn, nếu bạn muốn xây dựng một mạng lưới đường làm cho mọi người đi đến một điểm mốc quan trọng nào đó càng hiệu quả càng tốt. Tuy nhiên, cây đường đi ngắn nhất không được đảm bảo là cây bao trùm tối thiểu và tổng chi phí trên các cạnh của cây đường đi ngắn nhất có thể lớn hơn nhiều so với chi phí của MST.

Một sự khác biệt quan trọng khác liên quan đến các loại đồ thị mà thuật toán hoạt động. Thuật toán của Prim chỉ hoạt động trên đồ thị vô hướng, vì khái niệm MST giả định rằng đồ thị vốn là vô hướng. (Có một cái gì đó được gọi là "phát triển kéo dài tối thiểu" cho đồ thị có hướng, nhưng các thuật toán để tìm chúng phức tạp hơn nhiều). Thuật toán của Dijkstra sẽ hoạt động tốt trên các đồ thị có hướng, vì các cây đường đi ngắn nhất thực sự có thể được định hướng. Ngoài ra, thuật toán Dijkstra không nhất thiết mang lại giải pháp chính xác trong các đồ thị có chứa trọng số cạnh âm , trong khi thuật toán của Prim có thể xử lý điều này.

Hi vọng điêu nay co ich!


Đoạn đầu tiên không có ý nghĩa gì, anh bạn. Câu hỏi đặt ra là sự khác biệt giữa Dijkstra và Prim là gì, trong đó Dijkstra không phải như những gì bạn đã nói the length of a path between **any** two nodes, bạn chỉ nên tập trung tại sao khoảng cách giữa nút src và bất kỳ nút nào khác trong Prim không phải là ngắn nhất nếu nó không phải là ngắn nhất. Tôi nghĩ anh ta phải hỏi nút src trong Prim cho bất kỳ nút nào khác . Tại sao bạn lại nói về hai nút bất kỳ trong Prim? Đó tất nhiên không phải là ngắn nhất.
JW.ZG

1
Tôi đã làm sạch từ ngữ trong đoạn về thuật toán Dijkstra để làm rõ rằng cây đường dẫn ngắn nhất chỉ là bộ thu nhỏ cho các đường dẫn ngắn nhất bắt nguồn từ nút nguồn. Lý do tôi cấu trúc câu trả lời của mình là cách để minh họa những gì các thuật toán tìm thấy hơn là cách chúng hoạt động để hiển thị ở cấp độ cao hơn tại sao chúng tạo ra các kết quả khác nhau và tại sao bạn sẽ không mong đợi chúng giống nhau.
templatetypedef

1
Giải thích đơn giản nhất là trong Prims, bạn không chỉ định Nút bắt đầu , nhưng trong dijsktra, bạn (Cần phải có nút bắt đầu) phải tìm đường đi ngắn nhất từ ​​nút đã cho đến tất cả các nút khác. Xem stackoverflow.com/a/51605961/6668734
Deepak Yadav

1
@templatetypedef - Khi bạn nói: "và chi phí xây dựng một cái cây như vậy [với Dijkstra] có thể lớn hơn nhiều so với chi phí của một MST." bạn có thể vui lòng giải thích?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina Xin lỗi, điều đó hơi mơ hồ. Ý tôi muốn nói là tổng trọng số trên các cạnh của cây đường đi ngắn nhất có thể lớn hơn nhiều so với tổng trọng số trên các cạnh trong MST.
templatetypedef

82

Thuật toán Dijkstra không tạo MST, nó tìm đường đi ngắn nhất.

Hãy xem xét biểu đồ này

       5     5
  s *-----*-----* t
     \         /
       -------
         9

Con đường ngắn nhất là 9, trong khi MST là một 'con đường' khác ở 10.


2
Ok, cảm ơn ... bạn đã xóa một điểm tốt cần lưu ý. Cho đến bây giờ tôi đang xem xét rằng đầu ra do dijkstra tạo ra sẽ là MST nhưng bạn đã xóa nghi ngờ bằng một ví dụ điển hình. . Thanks a lot
Anuj Pradhan

8
Đúng hơn - The shortest path is 9... từ s đến t. Trọng số của đồ thị được tạo bởi thuật toán Dijkstra, bắt đầu từ s, là 14 (5 + 9).
Bernhard Barker

1
@Dukeling - Hả? trọng lượng của cây / đồ thị trong Dijkstra là vô nghĩa, đó là loại điểm ....
DFB

4
Được minh họa rất ngắn gọn!
Ram Narasimhan

1
@dfb: Thông thường chúng tôi chỉ chạy thuật toán Dijkstra để lấy đường đi ngắn nhất giữa một cặp đỉnh cụ thể, nhưng trên thực tế, bạn có thể tiếp tục cho đến khi tất cả các đỉnh đã được thăm và điều này sẽ cung cấp cho bạn "cây đường đi ngắn nhất", như câu trả lời của templatetypedef giải thích.
j_random_hacker

63

Các thuật toán Prim và Dijkstra gần như giống nhau, ngoại trừ "chức năng thư giãn".

Nghiêm trang:

MST-PRIM (G, w, r) {
    for each key ∈ G.V
        u.key = ∞
        u.parent = NIL
    r.key = 0
    Q = G.V

    while (Q ≠ ø)
        u = Extract-Min(Q)
        for each v ∈ G.Adj[u]
            if (v ∈ Q)
                alt = w(u,v)    <== relax function, Pay attention here
                if alt < v.key
                    v.parent = u
                    v.key = alt
}

Dijkstra:

Dijkstra (G, w, r) {
    for each key ∈ G.V
        u.key = ∞
        u.parent = NIL
    r.key = 0
    Q = G.V

    while (Q ≠ ø)
        u = Extract-Min(Q)
        for each v ∈ G.Adj[u]
            if (v ∈ Q)
                alt = w(u,v) + u.key  <== relax function, Pay attention here
                if alt < v.key
                    v.parent = u
                    v.key = alt
}

Sự khác biệt duy nhất được chỉ ra bởi mũi tên, đó là chức năng thư giãn.

  • Prim, tìm kiếm cây khung tối thiểu, chỉ quan tâm đến mức tối thiểu của tổng các cạnh bao phủ tất cả các đỉnh. Chức năng thư giãn làalt = w(u,v)
  • Dijkstra, tìm kiếm độ dài đường dẫn tối thiểu, vì vậy nó quan tâm đến tích lũy cạnh. Chức năng thư giãn làalt = w(u,v) + u.key

Ở cấp độ mã, sự khác biệt khác là API. Prim có phương thức edges()trả về các cạnh MST, trong khi Dijkstra có distanceTo(v), phương thức pathTo(v)này tương ứng trả về khoảng cách từ nguồn đến đỉnh v và đường dẫn từ nguồn đến đỉnh v, trong đó s là đỉnh mà bạn khởi tạo Dijkstra với.
nethsix

1
Hệ luỵ, khởi tạo đỉnh Prim với bất kỳ bất kỳ nguồn, s lợi nhuận đầu ra tương tự cho edges(), nhưng khởi Dijkstra với s khác nhau sẽ trở đầu ra khác nhau cho distanceTo(v), pathTo(v).
nethsix

Mồi có cho phép trọng lượng âm không? nếu có hơn đây là một sự khác biệt. Tôi đọc rằng bạn có thể cho phép trọng số âm trên linh trưởng bằng cách thêm số dương lớn. cho mỗi giá trị, làm cho tất cả giá trị đều dương.
Akhil Dad

1
Giải quyết sự nhầm lẫn của tôi! Câu trả lời hoàn hảo!!
Dhananjay Sarsonia

ở đây đỉnh được xử lý phải bỏ qua cho đồ thị vô hướng
Mr AJ

53

Thuật toán Dijsktra tìm khoảng cách tối thiểu từ nút i đến tất cả các nút (bạn chỉ định i). Vì vậy, đổi lại bạn nhận được cây khoảng cách tối thiểu từ nút i.

Thuật toán Prims giúp bạn có được cây spa tối thiểu cho một biểu đồ nhất định . Một cây kết nối tất cả các nút trong khi tổng của tất cả các chi phí là tối thiểu nhất có thể.

Vì vậy, với Dijkstra, bạn có thể đi từ nút đã chọn đến bất kỳ nút nào khác với chi phí tối thiểu , bạn không nhận được điều này với Prim's


Giải thích đơn giản nhất là trong Prims, bạn không chỉ định Nút bắt đầu , nhưng trong dijsktra, bạn (Cần phải có nút bắt đầu) phải tìm đường đi ngắn nhất từ ​​nút đã cho đến tất cả các nút khác. Xem stackoverflow.com/a/51605961/6668734
Deepak Yadav

32

Sự khác biệt duy nhất tôi thấy là thuật toán của Prim lưu trữ một cạnh chi phí tối thiểu trong khi thuật toán Dijkstra lưu trữ tổng chi phí từ một đỉnh nguồn đến đỉnh hiện tại.

Dijkstra cung cấp cho bạn một cách từ nút nguồn đến nút đích sao cho chi phí là tối thiểu. Tuy nhiên, thuật toán của Prim cung cấp cho bạn một cây bao trùm tối thiểu để tất cả các nút được kết nối và tổng chi phí là tối thiểu.

Nói một cách đơn giản:

Vì vậy, nếu bạn muốn triển khai một chuyến tàu để kết nối một số thành phố, bạn sẽ sử dụng thuật ngữ của Prim. Nhưng nếu bạn muốn đi từ thành phố này đến thành phố khác tiết kiệm thời gian nhất có thể, bạn nên sử dụng thuật ngữ Dijkstra.


24

Cả hai đều có thể được triển khai bằng cách sử dụng chính xác cùng một thuật toán chung như sau:

Inputs:
  G: Graph
  s: Starting vertex (any for Prim, source for Dijkstra)
  f: a function that takes vertices u and v, returns a number

Generic(G, s, f)
    Q = Enqueue all V with key = infinity, parent = null
    s.key = 0
    While Q is not empty
        u = dequeue Q
        For each v in adj(u)
            if v is in Q and v.key > f(u,v)
                v.key = f(u,v)
                v.parent = u

Đối với Prim, vượt qua f = w(u, v)và đối với Dijkstra vượt qua f = u.key + w(u, v).

Một điều thú vị khác là ở trên Generic cũng có thể triển khai Tìm kiếm đầu tiên theo chiều rộng (BFS) mặc dù nó sẽ quá mức cần thiết vì hàng đợi ưu tiên đắt tiền không thực sự bắt buộc. Để chuyển thuật toán Chung ở trên sang BFS, hãy chuyển f = u.key + 1nó giống như việc thực thi tất cả các trọng số thành 1 (tức là BFS cung cấp số cạnh tối thiểu cần thiết để đi ngang từ điểm A đến B).

Trực giác

Đây là một cách hay để suy nghĩ về thuật toán chung ở trên: Chúng ta bắt đầu với hai nhóm A và B. Ban đầu, hãy đặt tất cả các đỉnh của bạn vào B để nhóm A trống. Sau đó, chúng ta di chuyển một đỉnh từ B sang A. Bây giờ hãy xem tất cả các cạnh từ đỉnh ở A đi qua đỉnh ở B. Chúng ta đã chọn một cạnh bằng cách sử dụng một số tiêu chí từ các cạnh chéo này và di chuyển đỉnh tương ứng từ B sang A. Lặp lại quá trình này cho đến khi B trống.

Một cách brute force để thực hiện ý tưởng này là duy trì một hàng đợi ưu tiên của các cạnh cho các đỉnh trong A giao với B. Rõ ràng là sẽ rất rắc rối nếu đồ thị không thưa thớt. Vì vậy, câu hỏi sẽ là chúng ta có thể duy trì hàng đợi ưu tiên của các đỉnh không? Trên thực tế, điều này chúng ta có thể quyết định cuối cùng là chọn đỉnh nào từ B.

Bối cảnh lịch sử

Thật thú vị là phiên bản chung của kỹ thuật đằng sau cả hai thuật toán về mặt khái niệm đã cũ từ năm 1930 ngay cả khi chưa có máy tính điện tử.

Câu chuyện bắt đầu với Otakar Borůvka, người cần một thuật toán cho một người bạn của gia đình đang cố gắng tìm ra cách kết nối các thành phố ở đất nước Moravia (nay là một phần của Cộng hòa Séc) với những đường dây điện chi phí tối thiểu. Ông đã công bố thuật toán của mình vào năm 1926 trên một tạp chí liên quan đến toán học, vì Khoa học Máy tính chưa tồn tại khi đó. Điều này thu hút sự chú ý của Vojtěch Jarník, người đã nghĩ ra một cải tiến cho thuật toán của Borůvka và xuất bản nó vào năm 1930. Thực tế, ông đã phát hiện ra cùng một thuật toán mà ngày nay chúng ta biết là thuật toán của Prim, người đã phát hiện lại nó vào năm 1957.

Không phụ thuộc vào tất cả những thứ này, vào năm 1956, Dijkstra cần viết một chương trình để chứng minh khả năng của một máy tính mới mà viện của ông đã phát triển. Anh nghĩ sẽ rất tuyệt nếu có máy tính tìm kết nối để đi lại giữa hai thành phố của Hà Lan. Anh ấy đã thiết kế thuật toán trong 20 phút. Ông đã tạo một biểu đồ của 64 thành phố với một số đơn giản hóa (vì máy tính của ông là 6-bit) và viết mã cho chiếc máy tính năm 1956 này. Tuy nhiên, ông đã không công bố thuật toán của mình vì chủ yếu không có tạp chí khoa học máy tính và ông nghĩ điều này có thể không quan trọng lắm. Năm tiếp theo, ông đã tìm hiểu về vấn đề kết nối các thiết bị đầu cuối của máy tính mới sao cho chiều dài của dây được giảm thiểu. Anh ấy suy nghĩ về vấn đề này và phát hiện lại Jarník / Prim ' thuật toán s sử dụng kỹ thuật tương tự như thuật toán đường đi ngắn nhất mà anh ta đã phát hiện ra một năm trước. Anh tađã đề cập rằng cả hai thuật toán của ông đều được thiết kế mà không sử dụng bút hoặc giấy. Năm 1959, ông xuất bản cả hai thuật toán trong một bài báo dài chỉ 2 trang rưỡi.


Cảm ơn! Lối ra là vô lý, tại sao nó thoát khỏi vòng lặp ngay cả khi không có gì xảy ra?
amirouche

15

Dijkstra tìm ra con đường ngắn nhất giữa nút bắt đầu của nó và mọi nút khác. Vì vậy, đổi lại bạn sẽ có được cây khoảng cách tối thiểu từ nút đầu tức là bạn có thể tiếp cận mọi nút khác một cách hiệu quả nhất có thể.

Thuật toán Prims giúp bạn có MST cho một đồ thị nhất định, tức là một cây kết nối tất cả các nút trong khi tổng tất cả các chi phí là tối thiểu nhất có thể.

Để tạo một câu chuyện ngắn với một ví dụ thực tế:

  1. Dijkstra muốn biết đường đi ngắn nhất đến từng điểm đích bằng cách tiết kiệm thời gian di chuyển và nhiên liệu.
  2. Prim muốn biết cách triển khai hiệu quả hệ thống đường ray xe lửa, tức là tiết kiệm chi phí nguyên vật liệu.

10

Trực tiếp từ bài báo wikipedia của Thuật toán Dijkstra :

Quá trình làm nền tảng cho thuật toán Dijkstra tương tự như quá trình tham lam được sử dụng trong thuật toán Prim. Mục đích của Prim là tìm một cây bao trùm tối thiểu kết nối tất cả các nút trong đồ thị; Dijkstra chỉ quan tâm đến hai nút. Prim's không đánh giá tổng trọng số của đường dẫn từ nút bắt đầu, chỉ đánh giá đường dẫn riêng lẻ.


5
"Dijkstra quan tâm đến chỉ có hai nút" là bunk.
tmyklebu,

5

Gần đây, tôi thấy phiền với câu hỏi tương tự, và tôi nghĩ tôi có thể chia sẻ sự hiểu biết của mình ...

Tôi nghĩ rằng sự khác biệt chính giữa hai thuật toán này (Dijkstra và Prim) bắt nguồn từ vấn đề mà chúng được thiết kế để giải quyết, đó là, đường đi ngắn nhất giữa hai nút và cây khung tối thiểu (MST). Phương thức chính thức là tìm đường đi ngắn nhất giữa nút nói, nút s và nút t , và một yêu cầu hợp lý là phải truy cập vào mỗi cạnh của đồ thị nhiều nhất một lần. Tuy nhiên, nó KHÔNG yêu cầu chúng ta phải truy cập tất cả các nút. Điều thứ hai (MST) là yêu cầu chúng tôi truy cập TẤT CẢ các nút (nhiều nhất một lần) và với cùng một yêu cầu hợp lý là truy cập từng cạnh nhiều nhất một lần.

Nói như vậy, Dijkstra cho phép chúng ta "đi đường tắt" trong thời gian tôi có thể đi từ s đến t , mà không cần lo lắng về hậu quả - một khi tôi đến t , tôi đã hoàn thành! Mặc dù cũng có một con đường từ s đến t trong MST, nhưng con đường s - t này được tạo ra với sự cân nhắc của tất cả các nút còn lại, do đó, con đường này có thể dài hơn con đường s - t được tìm thấy bởi thuật toán Dijstra. Dưới đây là một ví dụ nhanh với 3 nút:

                                  2       2  
                          (s) o ----- o ----- o (t)     
                              |               |
                              -----------------
                                      3

Giả sử mỗi cạnh trên cùng có chi phí là 2 và cạnh dưới có chi phí là 3, thì Dijktra sẽ cho chúng ta biết đường đi dưới cùng, vì chúng ta không quan tâm đến nút giữa. Mặt khác, Prim sẽ trả về cho chúng ta một MST có 2 cạnh trên, bỏ đi cạnh dưới.

Sự khác biệt như vậy cũng được phản ánh từ sự khác biệt nhỏ trong việc triển khai: trong thuật toán Dijkstra, người ta cần phải có bước lưu giữ sổ sách (cho mọi nút) để cập nhật đường đi ngắn nhất từ s , sau khi hấp thụ một nút mới, trong khi trong thuật toán của Prim, là không cần như vậy.


3

Sự khác biệt chính giữa các thuật toán cơ bản nằm ở các tiêu chí lựa chọn cạnh khác nhau của chúng. Nói chung, cả hai đều sử dụng hàng đợi ưu tiên để chọn các nút tiếp theo, nhưng có các tiêu chí khác nhau để chọn các nút lân cận của các nút xử lý hiện tại: Thuật toán Prim yêu cầu các nút liền kề tiếp theo cũng phải được giữ trong hàng đợi, trong khi Thuật toán Dijkstra thì không:

def dijkstra(g, s):
    q <- make_priority_queue(VERTEX.distance)
    for each vertex v in g.vertex:
        v.distance <- infinite
        v.predecessor ~> nil
        q.add(v)
    s.distance <- 0
    while not q.is_empty:
        u <- q.extract_min()
        for each adjacent vertex v of u:
            ...

def prim(g, s):
    q <- make_priority_queue(VERTEX.distance)
    for each vertex v in g.vertex:
        v.distance <- infinite
        v.predecessor ~> nil
        q.add(v)
    s.distance <- 0
    while not q.is_empty:
        u <- q.extract_min()
        for each adjacent vertex v of u:
            if v in q and weight(u, v) < v.distance:// <-------selection--------
            ...

Các tính toán của vertex.distance là điểm khác biệt thứ hai.


3

Thuật toán Dijkstra là một bài toán đường đi ngắn nhất nguồn duy nhất giữa nút i và j, nhưng thuật toán Prim là một bài toán cây bao trùm tối thiểu. Thuật toán này sử dụng khái niệm lập trình có tên là 'thuật toán tham lam'

Nếu bạn kiểm tra các khái niệm này, vui lòng truy cập

  1. Ghi chú bài giảng thuật toán tham lam: http://jeffe.cs.illinois.edu/teaching/algorithm/notes/07-greedy.pdf
  2. Cây bao trùm tối thiểu: http://jeffe.cs.illinois.edu/teaching/algorithm/notes/20-mst.pdf
  3. Đường dẫn ngắn nhất nguồn duy nhất: http://jeffe.cs.illinois.edu/teaching/algorithm/notes/21-sssp.pdf

2

Thuật toán Dijkstras chỉ được sử dụng để tìm đường đi ngắn nhất.

Trong cây Spanning tối thiểu (thuật toán của Prim hoặc Kruskal), bạn nhận được các ví dụ nhỏ nhất với giá trị cạnh nhỏ nhất.

Ví dụ: - Hãy xem xét một tình huống mà bạn không thể tạo một mạng khổng lồ mà bạn sẽ yêu cầu một số lượng lớn dây để việc đếm dây này có thể được thực hiện bằng cách sử dụng Cây kéo dài tối thiểu (thuật toán của Prim hoặc Kruskal) (tức là nó sẽ cung cấp cho bạn số lượng dây tối thiểu để tạo kết nối mạng có dây khổng lồ với chi phí tối thiểu).

Trong khi "thuật toán Dijkstras" sẽ được sử dụng để lấy đường đi ngắn nhất giữa hai nút trong khi kết nối bất kỳ nút nào với nhau.


2

Giải thích đơn giản nhất là trong Prims, bạn không chỉ định Nút bắt đầu , nhưng trong dijsktra, bạn (Cần phải có nút bắt đầu) phải tìm đường đi ngắn nhất từ ​​nút đã cho đến tất cả các nút khác.


0

@templatetypedef đã đề cập đến sự khác biệt giữa MST và đường đi ngắn nhất. Tôi đã đề cập đến sự khác biệt của thuật toán trong một câu trả lời Vậy khác bằng cách chứng minh rằng cả hai đều có thể được triển khai bằng cách sử dụng cùng một thuật toán chung có thêm một tham số làm đầu vào: hàm f(u,v). Sự khác biệt giữa thuật toán của Prim và Dijkstra chỉ đơn giản là f(u,v)bạn sử dụng.


0

Ở cấp độ mã, sự khác biệt khác là API.

Bạn khởi Prim với một đỉnh nguồn, s , tức là Prim.new(s); s có thể là bất kỳ đỉnh nào, và bất kể s , kết quả cuối cùng, là các cạnh của cây khung tối thiểu (MST) đều giống nhau. Để có được các cạnh MST, chúng ta gọi phương thức edges().

Bạn khởi tạo Dijkstra với một đỉnh nguồn, s , tức là, Dijkstra.new(s)bạn muốn nhận được đường đi / khoảng cách ngắn nhất đến tất cả các đỉnh khác. Kết quả cuối cùng, là đường đi / khoảng cách ngắn nhất từ s đến tất cả các đỉnh khác; khác nhau tùy thuộc vào s . Để nhận được các đường đi / khoảng cách ngắn nhất từ s đến bất kỳ đỉnh nào, v , chúng ta gọi các phương thức distanceTo(v)pathTo(v)tương ứng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.