2013-08-19 20 views
13

Dijkstra algoritmasını öncelik sırasına göre uygulamaya çalışıyorum ama nasıl çalıştığını anlayamıyorum. İnternette birçok rehber okudum ama bu algoritmayı hiç anlayamıyorum.Minimum öncelikli sıraya sahip Dijkstra algoritması

Sorum sorum: her düğüm için öncelik nedir? Minimun değeriyle gelen kenarın ağırlığı olduğunu düşünüyorum, ama emin değilim. Bu doğru mu?

İkinci soru, sıranın kökünü ayıkladığımda, bu düğümün ziyaret edilen düğümlerden hiçbiriyle bitişik olmaması durumunda nasıl çalışır?

+0

Eğer Dijkstra'nın olarak düşünürseniz "ağırlıklı grafikler için Genişlik öncelikli arama," Bu oldukça kolay hale gelir anlama. Sorularınızı cevaplamak için: 1. Tam olarak değil - burası en uzak ** olan kenarlardan minimum **. 2. BFS ile olduğu gibi, ziyaret edilen bir düğümün bitişiğinde değilse, o zaman henüz ziyaret edilemez. Ziyaret edilen bir düğümden * ulaşılamıyorsa, hiç ziyaret edilmez. –

cevap

16

vertex'un vertex başlangıç ​​noktasından en kısa mesafeye sahip olduğu en yüksek önceliği priority queue kullanmalısınız. İlk olarak, tüm vertices sonsuz kısa mesafeyi ve PQ içinde grafikten (onun edges) tüm vertices arasında sokulmasıyla vertex başlangıç ​​en kısa mesafe olacak 0

Başlangıç ​​olacaktır. vertex'u PQ numaralı telefondan çıkarın ve edges kodlarını keşfedin. Bitişikteki tüm vertices ile en kısa mesafeleri karşılaştırın ve herhangi bir mesafe geçerli vertex üzerinde en kısa mesafeden daha azsa, PQ içinde en kısa mesafeyi bitişik vertex güncelleştirin. Devam PQ boş değil. edges numarasına sahip olmayan Vertices, vertex başından itibaren 'onlara ulaşma' mümkün olmadığından en kısa sonsuzluk mesafesini bitirecektir. Ancak, yine de PQ'dan kaldırılacaklar.

yalancı kod

initialize graph 
initialize pq 
pq.insertAll(graph.getVertices()) 

while (pq is not empty) { 
    vertex = pq.remove() 
    edges = vertex.getEdges() 

    for all edges { 
    destination = edge.getDestination() 
    newDistance = edge.getLength() + vertex.getDistance() 
    if (newDistance < destination.getDistance()) { 
     destination.setShortestDistance(newDistance) 
     pq.update(destination) 
    } 
    } 
} 

MIT Açık Ders Malzemeleri Bağlantılar:
Path problems overview
Dijkstra

+0

Metin, "Devam **, ** PQ boş değil" veya "PQ boş olduğunda devam et" yazmalıdır. Sözde kod doğru. –

+0

@CorpusGigantus teşekkürler, düzeltildi –

İlgili konular