Grafikte İki / Üç Farklı Asgari Yayılan Ağaç Var mı?


15

Verili bir grafik G'nin iki farklı minimum yayılan ağaç olup olmadığını tespit etmek için etkili bir yöntem bulmaya çalışıyorum. Ayrıca 3 farklı en az yayılan ağaç olup olmadığını kontrol etmek için bir yöntem bulmaya çalışıyorum. Düşündüğüm saf çözüm, Kruskal'ın algoritmasını bir kez çalıştırıyor ve minimum yayılan ağacın toplam ağırlığını buluyor. Daha sonra, bir kenarı grafikten kaldırmak ve Kruskal'ın algoritmasını tekrar çalıştırmak ve yeni ağacın ağırlığının orijinal minimum yayılan ağacın ağırlığı olup olmadığını kontrol etmek, ve böylece grafikteki her kenar için. Çalışma zamanı hiç iyi olmayan O (| V || E | log | V |) ve bunu yapmanın daha iyi bir yolu olduğunu düşünüyorum.

Herhangi bir öneri yardımcı olacaktır, şimdiden teşekkürler


Böyle bir algoritmadan haberdar olmak güzel olurdu, ama şu anki sorunu çözmeyecek
itamar

2
grafiğinin (1) V ( G ) ' nin herhangi iki alt kümeye bölünmesi için (1) her alt kümede bir uç noktası olan minimum ağırlık kenarı benzersizse ve (2) maksimum ağırlık ise benzersiz bir minimum yayılma ağacına sahip olacaktır. G'nin herhangi bir döngüsünde kenar benzersizdir. GV(G)G
Juho

Bu bir ve iki soru zaten sorunuzu cevaplıyor mu?
Juho

de ikinci en iyi MST'yi bulmak için CLRS'deki 23-1 sorununa bakın . O(n2)
Kaveh

Yanıtlar:


7

Kapoor & Ramesh ( uygun SIAM J. Bilgisayar sürümü , ücretsiz (?) Kişisel web sitesi sürümü ), hem ağırlıklı hem de ağırlıksız grafiklerde tüm minimum yayılan ağaçları numaralandırmak için bir algoritma verir.

Temel fikri anladığım kadarıyla, bir MST ile başlayıp grafikteki döngüler boyunca uzanan kenarları değiştirirsiniz (ağırlıklar iyi olduğu sürece, bir kenarı ağacı yeniden bağlayacağınızı bildiğiniz bir kenara değiştirirsiniz) .

Ağırlıklı durumda, tüm minimum kapsayan ağaçlarını listelemek için bir çalışma süresi verir, burada N , bu tür kapsayan ağaçların sayısıdır. Onları artan ağırlık sırasına göre sıralar ve mevcut (üstünkörü) anlayışım, belirli bir sayıda ağaç ürettikten sonra algoritmayı sonlandırmanın mükemmel bir şekilde mümkün olduğunu göstermektedir (sadece MST ile başlayıp sıralı olarak ürettiği için).O(N|V|)N


k

1
@ Raphael, gerçekten onunla başa çıkmak için zamanım olmadı (yay atama işareti), ama kaba anlayışımdan bu mümkün olmalı - bazı MST ile başlıyor, sonra onlardan tek tek üretiyor.
Luke Mathieson

1
nn2

1
O(|V|)

1
Hızlı bir okumadan sonra, ağırlıklı algoritma ağaçları artan ağırlık düzeninde üretir (açıkça bir MST'den başlayarak). Bu yüzden OP'nin amaçları için olmalıdır.
Luke Mathieson

2

Kruskal'ın algoritmasının her minimum yayılan ağacı bulabileceğini gösterebilir; buraya bakın .

kk


5
kkK1,5

@vonbrand İyi bir nokta. Tabii ki, hesaplamanın tüm dallarını bitirmeye devam edebiliriz, ancak daha sonra çalışma zamanı, üstel olabilecek yayılan ağaçların sayısı ile belirlenir.
Raphael

1

Birden fazla MST olup olmadığını görmek için, örneğin Kruskal'ın algoritmasını düşünün. Farklı MST'ler yapabilmesinin tek yolu, aynı ağırlığa sahip birkaç tane olduğunda başka bir tane seçerek kenarları dışarıda bırakmaktır. Ancak aynı ağırlıktaki kenarlar dışlanmış olabilir, çünkü daha açık kenarlı bir döngü oluşturdular ...

Bu nedenle, Kruskal'ın algoritmasını çalıştırmalısınız ve dikkate alınacak aynı ağırlığa sahip birkaç kenar olduğunda, döngü oluşturmadan eklenebilecek hepsini ekleyin. Bu ağırlığın bir kenarı kaldıysa ve daha düşük ağırlıklara sahip (daha önce eklenmiş olan) kenarlarla herhangi bir döngüyü kapatmazsa, birden fazla MST vardır. Tam olarak 2 veya 3 veya daha fazla olup olmadığını kontrol etmek, vb.


0

Kruskal algoritmasını değiştirme: Kenarları sipariş ederken, kenarları eşit ağırlıkta kümeleyin. Şimdi, kenarları sırayla işlediğiniz noktada, yeni bir kümeye her ulaştığınızda, önce tüm kenarları ayrı ayrı kontrol edin ve kümeden önce oluşturulanlar göz önüne alındığında, bir döngüyü kapatacak olanları kümeden çıkarın. Ardından, kümede kalan tüm kenarları şimdi MST'ye eklemeye çalışın. Bunlardan herhangi biri bir döngüyü kapatırsa, bunun nedeni daha önce aynı kümenin diğer kenarlarından kaynaklanmasıydı, yani birden fazla MST'niz var demektir.

Bu çözüm Kruskal'ın algoritmasının karmaşıklığını korur, sadece işlenen her kenar için süreyi arttırır.


Bir kümeyi sabit zamanda işleyebileceğinizi iddia ediyor gibi görünüyorsunuz, ancak bir kümenin boyutuyla ilgili belirgin bir sabit görmüyorum. Bu aşamanın nasıl yapıldığı hakkında daha fazla ayrıntı verebilir misiniz?
David Richerby
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.