Çizgi Roman: Resmin en kısa yolu nasıl bulunur? | Teknik Başlıklar

Yazar | Programcı Xiaohui

Bu makale, programcı Xiaohui'nin izni ile yeniden basılmıştır (ID: chengxuyuanxiaohui)

----- sonraki gün -----

Xiao Hui'nin fikirleri aşağıdaki gibidir:

İlk adım, A köşesinden diğer köşelere en kısa mesafeyi bulmak için Dijkstra algoritmasının uzaklık tablosunu kullanmaktır:

İkinci adım, B köşesinden diğer köşelerin her birine en kısa mesafeyi bulmak için Dijkstra algoritmasını kullanmaya devam etmektir.

Üçüncü adım, tepe C'den her bir tepe noktasına en kısa mesafedir.

Tepe D'den başlayarak dördüncü adım ...

.......

Aynen bunun gibi, tepe G'ye geçildi.

Bu fikrin zaman karmaşıklığı nedir?

Grafikte n tane köşe varsa, yığın optimizasyonu dikkate alınmazsa, Dijkstra algoritmasının zaman karmaşıklığı O (n ^ 2) olur. Bu nedenle, her tepe noktasını bir kez hesaplamak için toplam zaman karmaşıklığı O (n ^ 3) olur.

Bir kestane ver:

Yukarıdaki şekilde, tepe A ve tepe C'nin doğrudan bağlı kenarları yoktur ve aralarındaki doğrudan mesafe sonsuzdur.

B "röle tepe noktası" olarak alınırsa, A'dan C'ye en kısa yol A-B-C'dir ve en kısa mesafe 3 + 2 = 5'tir.

Bir kestane daha ver:

Yukarıdaki şekilde A tepe noktası ve C tepe noktası doğrudan bağlıdır ve mesafe 6'dır. Ama "dairesel" bir A-B-C yolu var, mesafe 3 + 2 = 5 < 6.

Bu nedenle, röle tepe noktası B'den sonra, A'dan C'ye en kısa mesafe 5 olabilir.

Floyd'un algoritmasının ayrıntılı adımlarına bir göz atalım.

1. Floyd algoritmasını uygulamak için önce ağırlıklı bir grafik içeren bir bitişik matris oluşturmanız gerekir:

Bitişik matrisinde, her sayı bir tepe noktasından başka bir tepe noktasına doğrudan mesafeyi temsil eder, bu mesafe herhangi bir röle tepe noktası içermez.

2. Bir röle tepe noktası olarak sadece A tepe noktasına izin verildiğini varsayarsak, köşeler arasındaki mesafe neye benzeyecektir?

B ve C arasındaki mesafe başlangıçta sonsuzdu, şimdi röle olarak A kullanılarak, mesafe AB mesafesi + AC mesafesi =

5 + 2 = 7.

İlgili matris öğelerini güncelleyin (turuncu alan, tepe A'dan diğer köşelere olan geçici mesafeyi temsil eder):

3. Ardından, A ve B köşelerini röle köşeleri olarak kullanarak, köşeler arasındaki mesafe nasıl görünecek?

A ve D arasındaki mesafe başlangıçta sonsuzdu Bu sırada röle olarak B ile mesafe AB mesafesi + BD mesafesi = 5 + 1 = 6 olacak şekilde kısaltılır.

A ve E arasındaki mesafe başlangıçta sonsuzdu.Bu sırada röle olarak B kullanılarak, mesafe AB mesafesi + BE mesafesi = 5 + 6 = 11 olacak şekilde kısaltılır.

İlgili matris öğelerini güncelleyin (turuncu alan, köşe B'den diğer köşelere olan geçici mesafeyi temsil eder):

4. Ardından, A, B ve C köşelerini röle köşeleri olarak kullanarak, köşeler arasındaki mesafe nasıl görünecek?

A ve F arasındaki mesafe başlangıçta sonsuzdu.Bu sırada, röle olarak C kullanılarak, mesafe AC mesafesi + CF mesafesi = 2 + 8 = 10 olacak şekilde kısaltılır.

İlgili matris öğelerini güncelleyin (turuncu alan, C köşesinden diğer köşelere olan geçici mesafeyi temsil eder):

Benzetme yaparak, sürekli olarak yeni röle köşeleri tanıtıyoruz ve matristeki geçici mesafeyi sürekli yeniliyoruz.

Son olarak, tüm köşeler röle köşeleri olarak kullanılabildiğinde, uzaklık matrisimiz şu şekilde güncellenir:

Şu anda, matristeki her öğe, bir tepe noktasından başka bir tepe noktasına en kısa mesafeye karşılık gelir.

Neden öyle diyorsun? Dinamik programlamanın iki unsurunu gözden geçirelim:

Sorunun ilk hali

Problem durumu geçiş denklemi

Grafiğin tüm köşeleri arasındaki mesafeyi bulma problemi için, başlangıç durumu bitişik matris olan köşeler arasındaki doğrudan mesafedir.

Ve sorunun durum geçiş denklemi nedir?

Yeni tanıtılan röle köşesinin n olduğunu varsayarsak, o zaman:

Tepe i'den tepe j'ye yeni mesafe j = Min (tepe noktasından j tepe noktasına olan eski mesafe, tepe noktası i'den tepe noktasına olan mesafe n + köşe n'den j köşesine olan mesafe)

son statik int INF = Tamsayı.MAX_VALUE; public static void floyd (int matrix) { // Bir döngüdeki matrisin değerini güncelle for (int k = 0; k < matrix.length; k ++) { for (int i = 0; i < matrix.length; i ++) { for (int j = 0; j < matrix.length; j ++) { eğer (matris == INF || matrix == INF) { devam et; } matris = Math.min (matris , matris + matris); } } } // floyd en kısa yolunun sonucunu yazdır System.out.printf ("en kısa yol matrisi: \ n"); for (int i = 0; i < matrix.length; i ++) { for (int j = 0; j < matrix.length; j ++) System.out.printf ("% 3d", matris ); System.out.printf ("\ n"); } } public static void main (String args) { int matrix = { {0, 5, 2, INF, INF, INF, INF}, {5, 0, INF, 1, 6, INF, INF}, {2, INF, 0, 6, INF, 8, INF}, {INF, 1, 6, 0, 1, 2, INF}, {INF, 6, INF, 1, 0, INF, 7}, {INF, INF, 8, 2, INF, 0, 3}, {INF, INF, INF, INF, 7, 3, 0} }; floyd (matris); }

Azınlığın gelecek varsayımları | Yakıt araçlarına veda edin? Arabanız sizi daha iyi anlamak istiyor
önceki
50 yaşındaki Yang Lan, kısa süre önce kocasının "şişman ve büyük kulaklarını" fotoğrafladı ve 18 yaşındaki kızının güzel görünüşü miras kalmadı.
Sonraki
Programcının gözyaşlarını izledikten sonra "Heaven Slaying the Dragon" versiyonu!
Oylama | Tıbbi bakımın ani ölümü 300.000 yuan tazmin edilebilir mi? Çin'deki tıp endüstrisindeki ilk karşılıklı sigortayı alacak mısınız?
Du Haitao ve Shen Mengchen'in 6 yıllık uzun mesafe koşusu: Hong Kong tarzı masallar bozuldu ve "Tao" tarzı vaatler yükseliyor
Seni yeniden inşa etmek için ne yapabilirim, Notre Dame de Paris?
6 gün bekleyin! Dongguan'daki WeChat üzerinden hane kaydı için randevu alabilirsiniz (süreç eklenmiş olarak)
Eski DJI çalışanları kaynak kodu sızdırdığı için hapse girdi; Alibaba Pratt & Whitney yazı tipi yayınlandı | Geek Manşetleri
19 self servis kütüphane toplu olarak çevrimiçi! Bu yıl Zhongshan Okuma Ayı için başka hangi aktiviteler var?
Sert siyah teknolojisi size Marvel'ın on yılda kaç karaktere sahip olduğunu söylüyor?
Çiftçilerin yemeği ne kadar karmaşık?
Little Blue Wave Bay, büyük futbol hayali! Zhongshan'daki binlerce ilkokul öğrencisi Dünya Günü'nde becerilerini gösteriyor | Video
Zhao Wei'nin makyajı sette yakın zamanda çekilmiş bir fotoğrafta ortaya çıktı ve cildi o kadar kötü ki tanıyamıyor! Alyans takmanın nadir olduğundan mı şüpheleniyorsunuz?
Temiz ve düzenli ön uç kodu | Teknik başlıklar
To Top