2016-03-18 29 views
4

Yönlendirilmiş bir grafikte zayıf bağlanmış her bileşenin bulunması için bir algoritma arıyorum. Ben bir dfs üzerinden bunu yapabilirsiniz, ama bu açıkça bir yönelimli grafik için işe yaramaz bir grafik için biliyorum. Grafiğimi bir bitişik liste olarak kaydediyorum. Örneğin :Yönlendirilmiş bir grafiğin zayıf bağlanmış bileşenlerinin her birini bulmak için algoritma

A -> B 
B -> C 
D -> X 

Yani A-B-C, bağlı bileşendir bir D-X

şiddetle bağlı bileşenleri bulmak için bir algoritma ararken değilim !!

+1

iyi, gereken kesin o zaman yönlendirilmiş grafikte bağlı bileşenlerin söz anlam olduğu. Bağlantılı bileşenleri "doğrulanmamış şekilde" mi kastediyorsunuz? – mingaleg

+1

Yönlendirilmiş bir grafiğin bağlı bir bileşeni olmadığını bildiğim kadarıyla, zayıf bağlanmış bileşenler hakkında konuşabilirsiniz (bunun için dfs + 'yı kullandığınız grafiği ters çeviriniz) ve güçlü şekilde bağlanmış bileşenler. Yönlendirilmiş bir grafiğin bağlı bileşeni ile ne demek istediğinizi daha iyi tanımlayabilir misiniz? – mancuernita

+0

Tamam, sadece tüm kenarları doğru olmayan ve bileşenleri " – mingaleg

cevap

3

Bellek kısıtlamalarınız çok katı olmadıkça, ikinci bir geçici bitişik listesini saklayabilirsiniz. Bu ikinci bitişik listede her kenarı a-> b koyup kenarları ters yönde yerleştirirsiniz. (ör. b-> a) Daha sonra, bağlı bileşenleri bulmak için bu komşu listesindeki DFS'yi kullanabilirsiniz.

+1

sadece tersine her bir kenarı saklamak gerekir, gerekli alanı azaltır. – Paul

+0

Yönlendirilmiş grafiği doğrulanmamış bir şekle dönüştürmeyi kavramsallaştırmanın daha kolay olacağını düşündüm. Tüm alan karmaşıklığı aynı olduğunda. Yine de belli ki haklısın. Orijinal grafiğin kenarlarını iki kez saklamak için gerekli alanı yarıya indirir. – ilim

2

Oldukça basit bir çözüm şu şekildedir:
Belirtilen grafikten doğrulanmamış bir grafik oluşturarak başlayın - yalnızca bir kopya oluşturun ve her kenar için kenarları kenarlara ekleyin. Köşe kümesinin bir kopyasını oluşturun, rasgele bir köşe ile başlayın ve DFS'yi köşeyi içeren bileşenle çaprazlayın, tüm çapraz düğümleri kümeden kaldırın ve bir listeye ekleyin. Liste boşalana kadar bunu tekrarlayın. pseudocode

:

bimap edges 
edges.putAll(graph.edges()) 

set vertices = graph.vertices() 

list result 

while !vertices.isEmpty() 
    list component 

    vertex a = vertices.removeAny() 
    dfsTraverse(a , v -> { 
     vertices.remove(v) 
     component.add(v) 
    }) 

    result.add(component)