2013-03-04 31 views

cevap

21

src'den dest'e gitmeniz gerektiğini varsayalım.

Her köşe x ilişkilendirmesiyle, iki değer sayılır ve geçer, sayım, src'den x'e giden en kısa yol sayısıdır ve val, src'den x'e olan en kısa mesafedir. Ayrıca, ilk kez değil, düğümün gelip gelmediğini belirten ziyaret edilen bir değişkeni koruyun.

o u aracılığıyla bugüne kadar kaynağından tek yolu vardır, böylece

Initialize u = src 
visited[u] = 1,val[u] = count[u] = 1 
For each child v of u, 
    if v is not visited 

Bir düğüm ilk kez ziyaret edilmektedir, her zamanki BFS algoritması Uygula v kadar böylece en kısa yol u kadar 1 + kısa yol olduğunu ve sayı En kısa yoldan v'ye ulaşmanın yollarının sayısı [u] ile aynıdır çünkü u kaynağından ulaşmanın 5 yolu vardır, o zaman sadece bu 5 yol v'ye kadar v ile genişletilebilir, böylece ilk kez u üzerinden karşılaşılır, bu nedenle

val[v] = val[u]+1,  
count[v] = count[u], 
visited[v] = 1 

if v is visited 

Eğer v zaten ziyaret edilmişse, başka bir v aracılığıyla v başka bir yol var demektir. ertices, daha sonra üç olgu ortaya çıkmaktadır: başka bir yol vasıtasıyla v kadar damıtılmış olan mevcut val [h] val eşittir

1 :if val[v] == val[u]+1 

halinde [u] + 1, ie akım kullanılarak v ulaşmak için eşit kısa mesafeler u ve diğer yoldan v'ye kadar olan yol, o zaman v'a kadar olan en kısa mesafe aynı kalır, ancak yolun sayıları u'ya ulaşma yollarının sayısına göre artar. ulaşan v akım yolu val önceki değerinden daha küçük ise,

count[v] = count[v]+count[u] 

2: val[v] > val[u]+1 

[V], o zaman val [V] akım yolu depolanır ve [V], aynı zamanda

val[v] = val[u]+1 
count[v] = count[u] 

üçüncü güncellenir sayısı durum, geçerli yolun önceki yoldan daha büyük bir mesafeye sahip olması durumunda, bu durumda, val [v] değerlerini değiştirmeye ve [v]

BFS tamamlanana kadar bu algoritmayı değiştirmeye gerek yoktur. Son val [dest] kaynağından en kısa mesafeyi içerir ve [dest] olarak sayın, src'den dest'e olan yol sayısını içerir.

+0

Yani, "ziyaret edilen" verteksini çağırdığınızda, bu şu anda BFS sırasının içinde olduğu anlamına gelir? Artık sıraya girmediğinde, karşılaştığımda sadece onu atlamalıyım? –

+0

Ayrıca, sayı değerine nereye ekleyebilirim? Src köşe değerinde sıfır sayımı ile başladığımda sıfırdan sıfır olur. –

+0

Ziyaret yok, bir kez ziyaret edildiğini gösterir. O sırada kuyruğa girmemeye gerek yok. Sayı için benim hatamdı. [Src] sayısını 1 olarak sıfırla, src'den src'ye ulaşmanın yol sayısı birdir. –

İlgili konular