DFT'de çapraz kenarlar ve ön kenarlar arasındaki fark


11

Derinlikte birinci ağaçta, ağacı tanımlayan kenarlar vardır (yani çaprazlamada kullanılan kenarlar).

Diğer düğümlerin bazılarını birbirine bağlayan artık kenarlar vardır. Çapraz kenar ile ileri kenar arasındaki fark nedir?

Vikipedi'den:

Bu yayılan ağaca dayanarak, orijinal grafiğin kenarları üç sınıfa ayrılabilir: ağacın bir düğümünden soyundan birine işaret eden ileri kenarlar, bir düğümden atalarından birine işaret eden arka kenarlar, ve hiçbiri olmayan çapraz kenarlar. Bazen yayılan ağacın kendisine ait olan ağaç kenarları, ön kenarlardan ayrı olarak sınıflandırılır. Orijinal grafik yönlendirilmemişse, tüm kenarları ağaç kenarları veya arka kenarlardır.

Geçişte kullanılmayan ve bir düğümden diğerine işaret eden kenar ebeveyn-çocuk ilişkisi kurmuyor mu?


İlgili: cs.stackexchange.com/questions/99988/… yönlendirilmiş grafik için, derinlik ilk arama sırasında çapraz kenarlar yerine ileri kenarlar yapmayı tercih edecek bir algoritma oluşturmayı amaçlamaktadır.
pfalcon

Yanıtlar:


23

Wikipedia'nın cevabı var:

resim açıklamasını buraya girin

Bu resimde tüm kenar tipleri görünüyor. Bu grafikte DFS'yi izleyin (düğümler sayısal sırayla araştırılır) ve sezginizin nerede başarısız olduğunu görün.


Bu şemayı açıklayacaktır: -

İleri kenar: (u, v), burada v u'nun bir torunu, ancak bir ağaç kenarı değildir. Bir DFS ağacındaki bir kökene bir tepe noktasını bağlayan ağaç olmayan bir kenardır.

Çapraz kenar: diğer kenarlar. Aynı derinlik-ilk ağaçta veya farklı derinlik-ilk ağaçlarda köşeler arasında gidebilir. (layman)
G grafiğindeki herhangi bir diğer kenardır. İki farklı DFS ağacındaki köşeleri veya aynı DFS ağacındaki ikisi de diğerinin atası olmayan iki köşeyi birbirine bağlar. (resmi)


İlk önce 6'nın (ilk önce sağ taraf) geçilmesi neden imkansız değildir? Bu olsaydı, 2-> 3 kenarı ne denirdi?
soandos

@soandos, algoritmayı izlemek için kendinize zaman ayırmanızı öneririm. Wikipedians'ın bir hata yapmadığını varsayarsak, görüntü bu grafikte DFS'nin iyi niyetli bir çalışmasını açıklar ve bu nedenle algoritmayı bu ize sığdırmanın bir yolu vardır. Kenar türleri Wikipedia'da yeterince açıklanmıştır ve bu örneğe de bakabilirsiniz.
Yuval Filmus

Bunun DFS yapmanın geçerli bir yolu olduğunu anlıyorum. Basitçe başka türlü yapılıp yapılmadığını soruyorum.
soandos

O zaman sonuçlar farklı olurdu. Üzgünüm, bunu kendiniz halletmeniz gerekecek.
Yuval Filmus

2
@soandos Genel olarak, çok sayıda DFS geçişi olabilir. Burada kullanılan kavramlar belirli bir geçişe göredir ve çoklu geçişler için farklılık gösterir.
Raphael

9

Yönlendirilmemiş bir grafikte DFS çapraz geçişi, bir tepe noktasında meydana gelen tüm kenarlar araştırıldığı için bir çapraz kenar bırakmayacaktır.

Bununla birlikte, yönlendirilmiş bir grafikte, tepe noktasının mevcut tepe noktasının bir atası ya da inişi olmayacağı şekilde daha önce keşfedilen bir tepe noktasına yol açan bir kenara rastlayabilirsiniz. Böyle bir kenara çapraz kenar denir.


Aporov, Yanıtınız için teşekkürler. Bana öyle geliyor ki, Wikipedia'da gösterildiği gibi DFS'de tepe 6'ya ulaştığınızda, 6'dan geçecek üç kenarınız var. Bu noktada, köşe 6 "güncel". Sonunda kenarı tepe 3'e çevireceksiniz. 3 zaten ziyaret edilmiş olsa da, yine de 6'dan 3'e bir kenar olduğundan, o zaman 3 "mevcut" tepe 6'nın soyundan gelir. Eğer öyleyse, ihlal çapraz kenarın tanımı. Tanımda çok açık yapılmayan bir şey daha olmalı.

Aslında, DFS sadece arka kenarlar için ağaç kenarlarından birini içerir (Algoritmalara Giriş Thm. 22.10).
jrhee17

2

Bir DFS geçişinde, tüm çocukları bittikten sonra düğümler bitirilir. Geçiş sırasında her bir düğüm için bulma ve bitiş zamanlarını işaretlerseniz, başlangıç ​​ve bitiş saatlerini karşılaştırarak bir düğümün torun olup olmadığını kontrol edebilirsiniz. Aslında herhangi bir DFS geçişi kenarlarını aşağıdaki kurala göre bölümlere ayıracaktır.

D [düğüm] düğümün keşif zamanı olsun, aynı şekilde f [düğüm] bitiş zamanı olsun.

Parantez Teoremi Tüm u, v için aşağıdakilerden biri geçerlidir:
1. d [u] <f [u] <d [v] <f [v] veya d [v] <f [v] <d [u ] <f [u] ve u ve v'nin hiçbiri diğerinin soyundan değildir.

  1. d [u] <d [v] <f [v] <f [u] ve v, u'nun soyundan gelir.

  2. d [v] <d [u] <f [u] <f [v] ve u, v'nin soyundan gelir.

Dolayısıyla, d [u] <d [v] <f [u] <f [v] gerçekleşemez.
Parantez gibi: () [], ([]) ve [()] iyi, ancak ([)] ve [(]) iyi değil.

Örneğin, kenarları olan grafiği düşünün:
A -> B
A -> C
B -> C

Ziyaret sırasının, "ABCCBA", A -> B -> C (bitmiş) B (bitmiş) A (bitmiş) anlamına gelen ((())) gibi bir dizi düğüm etiketiyle temsil edilsin.

Yani "ACCBBA", "(() ())" için bir model olabilir.

Örnekler:
"CCABBA": O zaman A -> C bir çapraz kenardır, çünkü CC A'nın içinde değildir.
"ABCCBA": O zaman A -> C bir ön kenardır (dolaylı torun).
"ACCBBA": O zaman A -> C bir ağaç kenarıdır (doğrudan torun).

Kaynaklar:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms Ders
Notları http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm

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.