Grafik berarah dikatakan unipathic jika untuk setiap dua simpul dan dalam grafik , paling tidak ada satu jalur sederhana dari ke .
Misalkan saya diberi grafik unipathic sehingga setiap sisi memiliki bobot positif atau negatif, tetapi tidak mengandung siklus bobot negatif.
Dari sini saya ingin menemukan algoritma yang menemukan semua jalur terpendek ke semua node dari sumber node .
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 ke .
algorithms
graphs
gprime
sumber
sumber
Jawaban:
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.s s n(n−1)/2 n
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|−1 s=0 −1 s s t .(s=R[…R[t]…],…,R[R[t]],R[t],t)
Lintasi grafik
Inisialisasi untuk semua - 1 .R −1
Lakukan traversal kedalaman-pertama atau luas-pertama dari grafik mulai dari . Setiap kali simpul u tercapai, atur R [ u ] ke pendahulunya.s u R[u]
Karena ada siklus, sebuah simpul mungkin dicapai lebih dari satu kali. Memiliki menunjukkan bahwa Anda telah dikunjungi.R[u]≠−1 u
Buktikan kebenarannya
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.
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)<n G n G 0=#C(G)<#V(G) (a1,…,am)
Ini menyimpulkan buktinya. Traversal mengikuti paling banyak edge.2|V|−2
sumber