Temukan jalur terpendek dalam grafik unipathic yang ditimbang

12

Grafik berarah dikatakan unipathic jika untuk setiap dua simpul u dan v dalam grafik G=(V,E) , paling tidak ada satu jalur sederhana dari u ke v .

Misalkan saya diberi grafik unipathic G sehingga setiap sisi memiliki bobot positif atau negatif, tetapi tidak mengandung siklus bobot negatif.

Dari sini saya ingin menemukan algoritma O(|V|) yang menemukan semua jalur terpendek ke semua node dari sumber node s .

Saya tidak yakin bagaimana cara mendekati masalah ini. Saya mencoba melihat bagaimana saya bisa menggunakan fakta bahwa tidak mengandung siklus berat negatif dan tentu saja paling banyak satu jalur sederhana antara sembarang simpul u ke v .

gprime
sumber
1
Apa yang sudah Anda coba sejauh ini? Jika Anda benar-benar mandek, mulailah dari yang kecil: seperti apa sebenarnya grafik unipathic? Sebagai contoh, gambar setiap grafik unipathic dengan satu titik, dua titik, tiga titik, dan sebagainya. Anda mungkin menemukan pola yang bermanfaat. Selain itu, Anda menyebutkan tidak ada siklus berat negatif - apakah ada siklus (berberat apa pun)?
Juho
@ mrm Pola apa yang Anda pikirkan? Grafik unipathic dapat memiliki siklus, dengan cara terbatas sehingga saya tidak dapat menemukan cara yang mudah untuk mengekspresikan.
Gilles 'SANGAT berhenti menjadi jahat'
@ mrm No. Tepi dapat dimiliki paling banyak satu siklus. Node dapat menjadi bagian dari sejumlah siklus: grafik -pointed-berbentuk bintang E = i n { ( a , b i ) , ( b i , a ) } adalah unipathic (dan Anda bisa mendapatkan yang lebih tinggi lagi rasio siklus dasar per node). nE=in{(a,bi),(bi,a)}
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

10

Pilih representasi data

Pertama, lihat ukuran hasilnya. Anda ingin koleksi jalur terpendek dari ke setiap node lainnya. Kecuali jika panjang rata-rata lintasan dibatasi oleh konstanta (yang bukan: lamanya daftar, dan jika Anda mengambil root untuk s , panjang total lintasan adalah n ( n - 1 ) / 2 di mana n adalah panjang daftar), Anda harus berhati-hati dalam representasi data Anda: struktur yang mengandung jalur harus menggunakan berbagi antar jalur.ssn(n1)/2n

Tidak termasuk siklus, ada jalur tunggal dari ke simpul lain u . Jika jalur tersebut melewati t titik tengah , maka segmen pertama dari jalur tersebut adalah jalur yang diinginkan dari s ke t . sutst

Saya mengusulkan untuk menyimpan hasilnya dalam array, diindeks oleh node bernomor dari hingga | E | - 1 , dengan s = 0 . Setiap elemen dalam array menyimpan indeks dari node sebelumnya pada path ke node tersebut (gunakan mis - 1 sebagai penanda khusus untuk node yang tidak dapat dijangkau dari s ). Jalur dari s ke t adalah ( s = R [ ... R [ t ] ... ] , ... , R [ R [ t0|E|1s=01sst .(s=R[R[t]],,R[R[t]],R[t],t)

Lintasi grafik

Inisialisasi untuk semua - 1 .R1

Lakukan traversal kedalaman-pertama atau luas-pertama dari grafik mulai dari . Setiap kali simpul u tercapai, atur R [ u ] ke pendahulunya.suR[u]

Karena ada siklus, sebuah simpul mungkin dicapai lebih dari satu kali. Memiliki menunjukkan bahwa Anda telah dikunjungi.R[u]1u

Buktikan kebenarannya

Karena properti unipathic, tidak masalah bagaimana kita mencapai setiap node, selama kita belum menyelesaikan siklus. Hanya ada satu jalur sederhana.

Buktikan kerumitannya

Algoritme dapat mencapai setiap node lebih dari satu kali, jadi tidak jelas bahwa kerumitannya adalah . Pekerjaan yang dilakukan sebenarnya Θ ( | E 0 | ) di mana V 0 adalah tepi yang dapat dijangkau dari sumber. Lebih tepatnya, kita mencapai sebuah simpul lebih dari sekali hanya dalam satu keadaan: jika simpul tersebut adalah yang pertama yang kita capai pada siklus tertentu, dan dalam hal ini kita mencapai dua kali (satu kali dari jalur sederhana, dan satu kali setelah menyelesaikan siklus) ).O(|V|)Θ(|E0|)V0

Baiklah kalau begitu. Mari kita buktikan bahwa dalam grafik unipathic, jumlah siklus elementer tumbuh paling banyak secara linier dengan jumlah node. (Siklus elementer adalah siklus yang tidak mengandung siklus yang lebih pendek.) Dalam diskusi berikut, saya akan berasumsi bahwa grafik tidak memiliki self-edge (tidak ada edge dari node ke dirinya sendiri; edge seperti itu tidak relevan untuk konstruksi path pula) ).

Grafik unipathic dapat memiliki siklus, tetapi dengan cara yang sangat terbatas. Akan lebih baik jika kita bisa mengaitkan setiap siklus dengan simpul yang berbeda (atau paling tidak, paling banyak jumlah siklus per node yang dibatasi). Bisakah siklus berbagi simpul? Sayangnya ya.

maabii,abi

Jadi kita harus bekerja lebih keras. Baiklah, mari kita coba buktikan secara induktif. Biarkan menjadi jumlah node dalam grafik , jumlah tepi dan jumlah siklus dasar yang bukan tepi diri. Saya menyatakan bahwa jika adalah unipathic dan tidak kosong maka .#V(G)G#E(G)#C(G)G#C(G)#V(G)1

Untuk grafik dengan satu atau dua node, ini jelas. Anggaplah pernyataan berlaku untuk semua grafik sedemikian rupa sehingga dan biarkan menjadi grafik unipathic dengan node. Jika tidak memiliki siklus, , tutup huruf. Kalau tidak, biarkan menjadi siklus dasar.#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

Perkecil siklus: misalkan adalah grafik yang simpulnya adalah dari minus plus simpul dan yang ujung-ujungnya adalah semua tepi tidak melibatkan , ditambah setiap kali dan setiap kali . Setiap jalur di menginduksi jalur di (jika jalur melibatkan , maka ganti dengan G { a 1 , ... , a m } a G a i a G 'a jc G G ' G G 'GG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajc dalam ). Karena itu adalah unipathic. Lebih lanjut, karena siklus dalam tidak berbagi sisi, memiliki semua siklus dalam kecuali untuk siklus yang kami hilangkan: . Dengan induksi, . Karena , kita memiliki .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

Ini menyimpulkan buktinya. Traversal mengikuti paling banyak edge.2|V|2

Gilles 'SANGAT berhenti menjadi jahat'
sumber