2011-03-31 36 views
6

Bazı kodları bağımlılıkları için analiz ediyorum.Döngüsel grafiği ağacı azaltın (bağımlılık grafiği -> ağaç)

    F 
     A   /| 
     |  /| 
     |  /| 
     V  < V 
     B<--->C--->E 
     \ / | 
     > <  | 
     D<------+ 

B A bağlıdır ve C C C ve D B bağlıdır F ve C ve E

bağlıdır E B ve F bağlıdır : orada bazı örülmüş bağımlılıkları, böylece gibi diyelim

B ve C ile ilgili bir problemimiz var, birbirlerine bağlılar. Süper düğümde birleştirilmelidirler. C ve E ve F ile ilgili bir sorunumuz var, bir döngüye sahipler. Süper düğümde birleştirilmelidirler.

Böyle azaltılması için izin veren iyi bir kütüphane veya algoritma (Java tercih ama önerilerine açık) kaynak var mı

A 
    | 
    V 
super 
node 
    | 
    | 
    D 

ile sona ereceğini?

Bir döngüdeki tüm düğümler tek bir düğümde birleştirilir. Yeni düğümdeki herhangi bir düğüme işaret eden herhangi bir düğüm, yeni düğüme işaret etmelidir. Yeni düğümdeki herhangi bir düğüm tarafından işaret edilen herhangi bir düğüm, yeni düğümün bu düğüme işaret etmesine neden olur.

Teşekkürler!

cevap

3

Grafiğin strongly connected components değerini birleştirmeyi istediğinizi düşünüyorum. Evet?

Algoritmayı hatırlamıyorum, bakmaya çalışacağım.

Düzenleme: Öğrendiğimiz Tarjan'ın. Öğretmek için yeterince iyi hatırlamıyorum ama here is the Wikipedia page.

Temel fikri vermeyi deneyeceğim. Her düğüme bir indeks verin. Sonra her düğüme bir lowlink # verin. Lowlink, bizim tarafımızdan kökteki düğümün indisidir: bize ulaşacak bir yol bulabilecek ilk düğüm. Eğer bizim lowlink == indeksimiz ise, o zaman güçlü bir şekilde bağlı bir bileşenin köküdür. Aksi takdirde, bizim lowlink bizim ile aynı bileşendedir. Bunu tüm grafik üzerinde yaparak, hangi düğümlerin güçlü bir şekilde bağlı bileşenlerin parçası olduğunu belirleyebiliriz.

+0

Gerçekten de tam da aradığım şey bu. Tarjan'ın algoritması, kendimi uygulayabilecek kadar basit görünüyor, ancak Java uygulamasına sahip olmanız durumunda bağlantıları memnuniyetle kabul ediyorum. – corsiKa

+0

Üzgünüm, yapmam. Algıladığım gibi algoritmanın wiki sayfasından biraz farklı olduğunu öğrendim, yığın olmadan ... Umarım başka birisi buna sahip olur mu? – usul

+0

Aslında wikipedia'nın bir bağlantısı var. Tabii ki, bu wiki, kendi sorumluluğunuzda. İyi şanslar! http://algowiki.net/wiki/index.php?title=Tarjan%27s_algorithm – usul

İlgili konular