Chọn một đại diện dữ liệu
Đầu tiên, nhìn vào kích thước của kết quả. Bạn muốn tập hợp các đường dẫn ngắn nhất từ đến mọi nút khác. Trừ khi độ dài trung bình của một đường dẫn được giới hạn bởi một hằng số (không phải là: bất kỳ danh sách nào là đơn cực và nếu bạn lấy gốc cho thì tổng chiều dài của các đường dẫn là trong đó là độ dài của danh sách), bạn sẽ cần cẩn thận trong biểu diễn dữ liệu của mình: cấu trúc chứa các đường dẫn sẽ cần sử dụng chia sẻ giữa các đường dẫn.s n ( n - 1 ) / 2 nssn(n−1)/2n
Không bao gồm các chu kỳ, có một đường dẫn duy nhất từ đến bất kỳ nút nào khác . Nếu đường dẫn đó đi qua một nút trung gian , thì đoạn đầu tiên của đường dẫn là đường dẫn mong muốn từ đến . u t s tsutst
Tôi đề nghị lưu trữ kết quả trong một mảng, được lập chỉ mục bởi các nút được đánh số từ đến , với . Mỗi phần tử trong mảng lưu trữ chỉ mục của nút trước đó trên đường dẫn đến nút đó (sử dụng ví dụ làm điểm đánh dấu đặc biệt cho các nút không thể truy cập được từ ). Đường dẫn từ đến sẽ là .| E | - 1 s = 0 - 1 s s t ( s = R [ ... R [ t ] ... ] , ... , R [ R [ t ] ] , R [ t ] , t )0| E| -1s = 0- 1SSt( S = R [ ... R [ t ] ... ] , ... , R [ R [ t ] ] , R [ t ] , t )
Đi qua đồ thị
Khởi tạo cho tất cả .- 1R- 1
Thực hiện di chuyển ngang trước hoặc chiều rộng đầu tiên của đồ thị bắt đầu từ . Mỗi khi đạt đến một nút , đặt thành tiền thân của nó.u R [ u ]SbạnR [ u ]
Vì có chu kỳ, một nút có thể đạt được nhiều lần. Có chỉ ra rằng đã được truy cập.uR[u]≠−1u
Chứng minh tính đúng đắn
Do thuộc tính đơn cực, việc chúng ta tiếp cận từng nút như thế nào, miễn là chúng ta chưa hoàn thành một chu kỳ. Chỉ có một con đường đơn giản.
Chứng minh sự phức tạp
Thuật toán có thể đến từng nút nhiều lần, vì vậy không rõ ràng rằng độ phức tạp của nó là . Công việc thực hiện là trên thực tế trong đó là các cạnh có thể tiếp cận được từ nguồn. Chính xác hơn, chúng ta tiếp cận một nút nhiều lần chỉ trong một trường hợp: nếu nút đó là lần đầu tiên chúng ta đạt được trên một chu kỳ cụ thể và trong trường hợp này chúng ta đạt được hai lần (một lần từ một đường dẫn đơn giản và một lần sau khi hoàn thành chu trình ).Θ ( | E 0 | ) V 0O(|V|)Θ(|E0|)V0
Vậy thì tốt. Chúng ta hãy chứng minh rằng trong một biểu đồ đơn cực, số chu kỳ cơ bản tăng trưởng tuyến tính nhiều nhất với số lượng nút. (Một chu trình cơ bản là một chu trình không chứa chu kỳ ngắn hơn.) Trong cuộc thảo luận sau đây, tôi sẽ giả sử rằng biểu đồ không có cạnh tự (dù không có cạnh nào từ nút đến chính nó; ).
Đồ thị đơn cực có thể có chu kỳ, nhưng theo một cách rất hạn chế. Sẽ thật tuyệt nếu chúng ta bằng cách nào đó có thể liên kết mỗi chu kỳ với một nút riêng biệt (hoặc ít nhất, nhiều nhất là số lượng chu kỳ giới hạn trên mỗi nút). Chu kỳ có thể chia sẻ một nút? Không may là đúng vậy.
maabi∀i,a⇆bi
Vì vậy, chúng tôi sẽ cần phải làm việc chăm chỉ hơn. Vâng, chúng ta hãy cố gắng chứng minh nó theo quy nạp. Đặt là số nút trong biểu đồ , số cạnh và số chu kỳ cơ bản không tự cạnh. Tôi khẳng định rằng nếu là đơn cực và không trống thì .G # E ( G ) # C ( G ) G # C ( G ) ≤ # V ( G ) - 1# V( G )G# E( G )# C( G )G# C( G ) ≤ # V( G ) - 1
Đối với một biểu đồ có một hoặc hai nút, điều này là hiển nhiên. Giả sử giữ xác nhận cho tất cả các đồ thị sao cho và đặt là đồ thị đơn cực với nút. Nếu không có chu kỳ, , trường hợp đã đóng. khác, hãy để là một chu kỳ cơ bản.G n G 0 = # C ( G ) < # V ( G ) ( a 1 , Mạnh , a m )# V( G ) < nGnG0 = # C( G ) < # V( G )( một1,…,am)
Thu gọn chu trình: đặt là đồ thị có các nút của trừ cộng với một nút và các cạnh của nó là tất cả các cạnh của không liên quan đến , cộng với bất cứ khi nào và bất cứ khi nào . Mọi đường dẫn trong tạo ra một đường dẫn trong (nếu đường dẫn liên quan đến , thì thay thế đường dẫn này bằng G { a 1 , Mạnh , a m } a G a i a → G ′ b ∃ i , a i → G b b → G ′ a ∃ i , b → G a i G ′ G b → a → c b → một i → một i + 1 → ...G′G{a1,…,am}aGaia→G′b∃i,ai→Gbb→G′a∃i,b→GaiG′Gb→a→cG G ' G G ' G # C ( G ' ) = # C ( G ) - 1 # C ( G ' ) ≤ # V ( G ' ) - 1 # V ( G ' ) = # V ( G ) - m + 1 # C ( Gb→ai→ai+1→…→aj→c trong ). Do đó, là đơn phương. Hơn nữa, vì các chu kỳ trong không chia sẻ các cạnh, có tất cả các chu kỳ trong ngoại trừ chu kỳ chúng tôi đã loại bỏ: . Theo cảm ứng, . Vì , nên chúng tôi có .GG′GG′G#C(G′)=#C(G)−1#C(G′)≤#V(G′)−1#V(G′)=#V(G)−m+1#C(G)=#C(G′)+1≤#V(G)−m=n−m≤n−1
Điều này kết luận bằng chứng. Truyền tải theo sau nhiều nhất là cạnh.2|V|−2