Biểu đồ con chứa tất cả các nút và cạnh là một phần của đường dẫn đơn giản có giới hạn độ dài trong đồ thị không bị chặn


12

Khá giống với câu hỏi được đăng trước đây của tôi . Lần này, đồ thị là vô hướng.

Được

  • Một đồ thị vô hướng GG không có nhiều cạnh hoặc vòng lặp,
  • Một đỉnh nguồn ,Ss
  • Một đỉnh mục tiêu ,tt
  • Độ dài đường dẫn tối đa ,tôil

Tôi đang tìm - Một sơ đồ con của chứa bất kỳ đỉnh và bất kỳ cạnh nào trong (và chỉ các cạnh đó), là một phần của ít nhất một đường dẫn đơn giản từ đến có độ dài .G G G GG Gs st tll

Ghi chú:

  • Tôi không cần phải liệt kê các đường dẫn.
  • Tôi đang tìm kiếm một thuật toán hiệu quả (cả thời gian và bộ nhớ), vì tôi cần thực hiện nó trên các đồ thị rất lớn (10 ^ 8 đỉnh, 10 ^ 9 cạnh).

kiểm tra này Tìm thấy bài báo này , dường như thực hiện giảm dòng chi phí tối thiểu tương tự, nhưng sử dụng các đặc tính đặc biệt của mạng để giải quyết nó nhanh hơn các thuật toán MCF chung.
RB

Câu trả lời:


6

Vâng, vấn đề là ở P sau khi tất cả. Tôi sẽ giữ câu trả lời trước vì nó cũng hoạt động cho trường hợp được chỉ đạo (đó là NPC, như đã trả lời cho câu hỏi khác) và cho thấy đó là F P T đối với l .PFPTl

Trong trường hợp không xác định, nó có thể giải quyết được, xác định thông qua dòng chi phí tối thiểu (điều này có thể không hoạt động trên thang đo mà bạn đang đề cập trong câu hỏi, nhưng nó tốt hơn thuật toán theo cấp số nhân.

Các thủ tục sau đây sẽ quyết định có một số lợi thế cạnh e = ( u , v ) E nên là một phần của đồ thị đầu ra. Để trả lời vấn đề ban đầu, chỉ cần lặp qua tất cả các cạnh.e=(u,v)E

Để tạo mạng lưu lượng, hãy làm như sau:

Bước 1: Mở rộng e để có đỉnh x e và thay thế e bằng các cạnh ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (chúng được định hướng là a một phần của mạng lưu lượng), đặt chi phí của chúng thành 0.exee(u,xe),(xe,u),(v,xe),(xe,v)

Bước 2: thay thế mọi đỉnh t , ngoại trừ x e bằng hai đỉnh t -t + , và thêm một cạnh ( t - , t + ) . Đặt chi phí của các cạnh này thành 1.txett+(t,t+)

Bước 3: Thay thế mọi cạnh { a , b } E bằng các cạnh ( a + , b - ) , ( b + , a - ) . Đặt chi phí của các cạnh này thành 0.{a,b}E(a+,b),(b+,a)

Bước 4: Thêm một đỉnh mới y e và thêm các cạnh ( s , y e ) , ( t , y e ) với chi phí 0.ye(s,ye),(t,ye)

Bước 5: đặt tất cả các dung lượng thành 1.

Bây giờ hãy chạy thuật toán dòng chi phí tối thiểu, tìm kiếm luồng giá trị 2 từ x e đến y e .xeye


Phân tích:

  • Mỗi luồng có 2 giá trị từ x e đến y e là một liên kết của một đường dẫn x es y e và một đường dẫn x et y e .xeyexesyexetye
  • Các đường dẫn không khớp nhau, vì với mỗi đỉnh t chỉ có 1 công suất trong cung ( t - , t + ) .t(t,t+)
  • Các đường dẫn được trả về là hai đường dẫn có tổng khoảng cách là tối thiểu và đó cũng là chi phí của luồng tìm thấy. Điều này cho phép chúng ta thêm e vào biểu đồ đầu ra hoặc xóa khác.e

1
Sẽ dễ hiểu hơn đối số trong câu trả lời ở trên bằng cách tước đi sự giảm bớt thành luồng có hướng. Có một đường dẫn đơn giản từ s đến t chứa một nút v iff có một đường dẫn P từ v đến s và một đường dẫn Q từ v đến t sao cho PQ là nút tách rời nhau ngoại trừ tại v . Điều này chủ yếu sử dụng vô hướng. Điều này có thể được kiểm tra thông qua luồng và phiên bản chi phí cũng có thể được thực hiện thông qua luồng chi phí tối thiểu. Người ta có thể kiểm tra xem có một đường dẫn đơn giản từ s đến t có chứa e khôngstvPvsQvtPQvstebằng cách giới thiệu một nút ở giữa e . e
Chandra Chekuri

@ChandraChekuri - đúng vậy, nhưng hãy nhớ rằng nếu sự cố không có ràng buộc về độ dài, có một thuật toán đơn giản hơn nhiều để quyết định nó - xem tại đây
RB

Chắc chắn, tôi cũng nhận thức được giải pháp đó - về mặt khái niệm, thật tốt khi hiểu các thành phần hai mặt thông qua các đường dẫn rời rạc mặc dù người ta có thể tìm thấy các đỉnh cắt và các thành phần hai mặt trực tiếp thông qua DFS.
Chandra Chekuri

@RB: Cảm ơn bạn. Các algorihm được đề xuất có thể có hiệu quả khi l tương đối lớn, nhưng nó có thể là tối ưu cho các giá trị tương đối nhỏ của l. Tôi đoán rằng tôi có thể cắt G trước bằng cách loại bỏ bất kỳ đỉnh nào xa hơn sàn (l / 2) khỏi s và trần (l / 2) khỏi t.
Lior Kogan

1
Hãy thử điều chỉnh thuật toán đường dẫn ngắn nhất kế tiếp (còn gọi là thuật toán của Surballe cho trường hợp có 2 đường dẫn đáng quan tâm ở đây). Bạn muốn tìm 2 đường dẫn ngắn nhất từ y (tốt hơn là gọi nó là y thay vì y e vì nó giống nhau cho tất cả các cạnh) cho mọi x e . Tôi nghĩ rằng điều này có thể thực hiện được một cách hiệu quả bằng cách đầu tiên tính toán một cây đường đi ngắn nhất từ y và sau đó thực hiện tính toán đường dẫn thứ hai một cách cẩn thận. yyyexey
Chandra Chekuri

1

Đây là một câu trả lời sai : nó đưa ra một số đỉnh là một phần của các đường dẫn không đơn giản từ s đến t và đó không phải là một phần của bất kỳ đường dẫn đơn giản nào từ s đến t có độ dài . Câu trả lời có thể vẫn liên quan đến ứng dụng của người hỏi, vì vậy tôi sẽ để nó ở đây.stst

Đây là một thuật toán chạy trong thời gian O ( | V | + | E | ) (và thực sự là nhanh hơn này khi là nhỏ).O(|V|+|E|)

Thuật toán chạy một tìm kiếm BFS từ s mà chấm dứt ở độ sâu . BFS Điều này cho phép một bộ V s của tất cả các đỉnh có thể truy cập từ s với một con đường có chiều dài tối đa là , và nó cũng sẽ tính toán khoảng cách d i s t ( s , v ) cho mỗi v V s . Sau đó, tôi sẽ làm tương tự từ t và nhận tập V t và khoảng cách từ t . Cuối cùng, các đỉnh bạn đang tìm kiếm chính xác là V s o l usVssdist(s,v)vVstVttt i o n ={v:v V s V t ,dist(s,v)+dist(t,v)}. Các cạnh chính xác là các cạnh trongE[ V s o l u t i o n ](=(v,u)Vsolution={v:vVsVt,dist(s,v)+dist(t,v)}E[Vsolution]E : u , v V s o l u t i o n ).=(v,u)E:u,vVsolution

Thời gian chạy của thuật toán này chắc chắn là O ( | V | + | E | ) vì nó chỉ thực hiện hai BFS. Nhưng thời gian chạy thực sự là O ( | V s | + | V t | + | E [ V s ] | + | E [ V t ] | ) mà sẽ nhỏ hơn nhiều so với kích thước của đồ thị khi -radius khu phố của stO(|V|+|E|)O(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|)st nhỏ.

Chỉnh sửa: có thể là một thuật toán hơi nhanh hơn trong thực tế mà không một BFS từ st chiều sâu chỉ / 2 chứ không phải là . Điều này khám phá tất cả các đường dẫn, và sau đó với một chút sổ sách kế toán, bạn có thể tìm thấy tất cả các đỉnh. Điều này cắt giảm thời gian chạy bởi một căn bậc hai đối với trường hợp của một đồ thị ngẫu nhiên tìm kiếm lớn khi là nhỏ.st/2


3
Điều này không buộc con đường phải đơn giản. Xét đồ thị đường dẫn đơn giản t - u - s - v - xl = 4 . Bạn sẽ trả về v như một phần của đầu ra, mặc dù không có đường dẫn đơn giản nào đi qua v ...tusvxl=4vv
RB

Cảm ơn đã sửa @RB. Tôi đã chỉnh sửa câu trả lời của mình để lưu ý rằng nó sai.
bánh bao mobius

1

Điều này được dự định là một bình luận, nhưng quá lâu để đăng như một bình luận.

Bạn cũng có thể quan tâm đến các trình vẽ đồ thị hoặc trình giả lập cho mục đích của mình. Một cờ lê của một đồ thị G = ( V , E ) là một đồ thị con H = ( V , E ' ) với vài cạnh, nhưng khoảng bảo quản khoảng cách. Một giả lập là một đồ thị H = ( V , E ' , w ) có các cạnh được phép trọng.G=(V,E)H=(V,E)H=(V,E,w)

Kết quả tốt nhất cho spanners là O ( n 4 / 3 ) cạnh và một lỗi phụ gia của 6 trên ước tính khoảng cách trong đồ thị. Kết quả tốt nhất cho emulators là O ( n 4 / 3 ) cạnh và một lỗi phụ của 4. Người ta không biết cho một trong hai nếu chúng ta có thể đánh bại O ( n 4 / 3 ) , ngay cả khi lỗi được phép có polylogarithmic.O(n4/3)O(n4/3)O(n4/3)

Nếu điều này nghe có vẻ hữu ích, tôi có thể thử và đào các công trình liên quan cho bạn.

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.