Tìm đường đi ngắn nhất trong đồ thị đơn cực có trọng số


12

Một đồ thị có hướng được gọi là đơn cực nếu với hai đỉnh và trong đồ thị , có nhiều nhất một đường dẫn đơn giản từ đến .uvG=(V,E)uv

Giả sử tôi được đưa ra một đồ thị đơn cực sao cho mỗi cạnh có trọng số dương hoặc âm, nhưng không chứa chu kỳ trọng số âm.G

Từ đây tôi muốn tìm một thuật toán tìm tất cả các đường dẫn ngắn nhất tới tất cả các nút từ một nút nguồn .O(|V|)s

Tôi không chắc chắn làm thế nào tôi sẽ tiếp cận vấn đề này. Tôi đang cố gắng xem làm thế nào tôi có thể sử dụng thực tế là nó không chứa chu kỳ trọng lượng âm và tất nhiên nhiều nhất là một đường dẫn đơn giản giữa bất kỳ nút đến .uv


1
Bạn đã thử những gì cho đến nay? Nếu bạn hoàn toàn bị mắc kẹt, hãy bắt đầu nhỏ: đồ thị đơn cực thực sự trông như thế nào? Ví dụ: vẽ mọi đồ thị đơn cực với một đỉnh, hai đỉnh, ba đỉnh, v.v. Bạn có thể nhận ra một mô hình hữu ích. Ngoài ra, bạn đề cập đến không có chu kỳ trọng lượng âm - thậm chí có thể có chu kỳ (của bất kỳ trọng lượng)?
Juho

@mrm Bạn đang nghĩ đến mô hình nào? Đồ thị đơn cực có thể có chu kỳ, theo cách bị ràng buộc mà tôi không thể tìm thấy một cách dễ dàng để thể hiện.
Gilles 'SO- ngừng trở thành ác quỷ'

@mrm Không. Một cạnh có thể thuộc tối đa một chu kỳ. Một nút có thể thuộc bất kỳ số chu kỳ nào: đồ thị hình ngôi sao là đơn cực (và bạn có thể có được tỷ lệ cao hơn các chu kỳ cơ bản trên mỗi nút). E = i n { ( a , b i ) , ( b i , a ) }nE=in{(a,bi),(bi,a)}
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


10

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(n1)/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=01sst(S= =R[Giáo dụcR[t]Giáo dục],Giáo dục,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[bạn]

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.

maabii,abi

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)(a1,,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 imột i + 1...GG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacG G ' G G ' G # C ( G ' ) = # C ( G ) - 1 # C ( G ' ) # V ( G ' ) - 1 # V ( G ' ) = # V ( G ) - m + 1 # C ( Gbaiai+1ajc 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ó .GGGGG#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

Đ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

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.