Bir DAG'daki iki köşe arasında en kısa ve en uzun yolları bulma


14

Bir ağırlıksız DAG (yönlendirilmiş asiklik grafik) göz önüne alındığında, ve iki köşe ve , bunun en kısa ve en uzun yol bulmak mümkündür için polinom zamanda? Yol uzunlukları kenar sayısı ile ölçülür.s t s tD=(V,A)stst

Polinom zamanındaki olası yol uzunlukları aralığını bulmakla ilgileniyorum.

Ps., Bu soru StackOverflow sorusunun bir DAG'daki en uzun yolunun kopyası .

Yanıtlar:


10

En kısa yol problemi için, ağırlıkları önemsemezsek, önce genişlik ilk arama kesin bir yoldur. Aksi takdirde Dijkstra'nın algoritması , negatif kenar olmadığı sürece çalışır.

En uzun yol için, Bellman-Ford'u grafikte her zaman tüm kenar ağırlıkları ihmal edilmiş olarak yapabilirsiniz. Bellman-Ford'un negatif ağırlık döngüleri olmadığı sürece çalıştığını ve bu nedenle bir DAG üzerindeki ağırlıklarla çalıştığını hatırlayın.


2
Bellman-Ford olan dinamik bir programlama algoritması.
Raphael

1
@Raphael evet, ama bence tüm kenar ağırlıklarını reddetmek yerine, maksimum yolu bulmak için doğrudan bir DP algoritması var.
jmite

1
@jmite: Neden, tabii ki: sadece çevrimiçi dönüşüm yapmak veya en üst düzeye çıkarmak için Bellman-Ford değiştirmek veya maksimize, ya da ...
Raphael

1
Bu arada, sezgisel olarak NP-tam sorununun En Uzun Yolu'nun DAG'lar üzerindeki P'de kolayca olduğuna ikna olmadım. Bir kanıt / referans / açıklama takdir ediyorum.
Raphael

2
Ayrıca DAG

8

Letve. Let kenarının ağırlığını verir . Eğer gelen minimum ve maksimum yol maliyetini bulmak istediğinizi varsayalım için .m = | E ( G ) | w ( a b ) ( a b ) s tn=|V(G)|m=|E(G)|w(ab)(ab)st

başlayarak aşağıdakileri yapın:b:=t

  1. daha önce ziyaret edilmişse , önceden hesaplanmış ve . Aksi halde ziyaret edildiği gibi işaretleyin .bmin(b)max(b)b

  2. ve değerini aşağıdaki gibi belirleyin ve kaydedin .min(b)max(b)

    • Eğer , mağaza .b=smin(s):=max(s):=0
    • Else set , . Boş bir kenar kümesi üzerinden minimum ve maksimum değerleri hesaplarken (hiç gelen kenar yok veya yok sayılır), . min(a)=maks(a)=inaccessible
      min(b):=minab[w(ab)+min(a)]max(b):=maxab[w(ab)+max(a)]
      min(a)=max(a)=inaccessiblebmin(b):=max(b):=inaccessible

Bu algoritmanın zamanında çalıştığını ve tüm köşe değişkenlerini başlatmak için gereken süreyi ihmal ettiğini kanıtlayabilmelisiniz .O(m)


Bu özyinelemeli "çekme" yaklaşımı aslında alışılmış dinamik "itme" yaklaşımından daha yavaş olabilir ve özyinelemeyi gerçekleştirmek için doğrusal boyutta bir desteğe ihtiyaç duyar. Genel yaklaşım, köşeleri topolojik bir sırayla almak ve mevcut düğümün her komşusu için ara minimum ve maksimum değerlerini iyileştirmektir. Mevcut düğüm her zaman minimum ve maksimum nihai değere sahiptir, çünkü tüm gelen kenarlar bunları geliştirmek için zaten kullanılmış olmalıdır.
Palec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.