DAG'ın geçişte azaltılması


13

Bir DAG verilen geçişli indirgeme bulmak için O (V + E) algoritması arıyorum .

Bu, mümkün olduğunca çok sayıda kenarı kaldırır, böylece u'dan v'ye erişebiliyorsanız, v ve u için keyfi olarak, yine de kenarları çıkardıktan sonra ulaşabilirsiniz.

Bu standart bir sorunsa, lütfen beni bazı model çözümlerine yönlendirin.


Alıntı yaptığınız wikipedia lemmasında verilen referansı kullanamaz mısınız?
Hendrik Jan

2
Wikipedia'da tartışılan algoritma , istendiği gibi yerine (en iyi durumda, yani asiklik grafikler durumunda) içinde çalışır . Sanırım burada doğru cevap şu anda aradığınız algoritmanın mevcut olmayabileceğidirO ( V + E )O(V×E)O(V+E)
Carlos Linares López

1
İstediğinizin varlığının açık olmadığı konusunda hemfikir. Böyle bir algoritma olsaydı ilginç olmayacak birkaç makale var, örneğin, sciencedirect.com/science/article/pii/0012365X9390164O . Bununla birlikte, motivasyonunuzun ne olduğu hakkında daha spesifik olursanız, daha spesifik çözümler olabilir. Örneğin, grafik hakkında başka bir şey biliyor musunuz yoksa işe yarar mı? O(n(n+m))
William Macrae

Sorunu bir yerde gördüm, ancak ek bilgi yoktu, belki problemde bir yazım hatası vardı.
Karan

1
topolojik sıralama yaparsanız, ancak çocukları kullanarak ulaşılabilir köşeleri takip ederseniz, yani , ardından sıralı grafikteki en son öğeden başlayın, ve kullanılmayan kenarları kaldırın ve ulaşılabilir işlevi koruyarak yukarı çıkın, bu size mümkün olan maksimum kenarları verir, ancak maksimum olasılık elde edip etmediğinden emin değilim ( .O ( | E | + | V | )reachable[v]=vchildrenvreachable[v]O(|E|+|V|)

Yanıtlar:


8

Bu sorunu sadece her bir köşeden DFS yaparak çözebiliriz.

  1. her bir köşesi için, her bir köşesinden DFS'yi başlatın, böylece , doğrudan torunu olacaktır , yani. bir kenardır.v v u ( u , v )uGvvu(u,v)
  2. Her bir köşe için dan DFS ulaşılabilir , kenar kaldırmak .v( u , v )v(u,v)

Yukarıdakilerin genel karmaşıklığı , olan DFS'yi çalıştırmanın karmaşıklığıdır .O ( N ( N + M ) )NO(N(N+M))


1
Asimptotik olarak , sorunun kendisinde bağlantılı Wikipedia makalesinde algoritması ile aynı karmaşıklığa sahip olduğuna dikkat edin. O(NM)
David Richerby

1
Kabul. Bu soruya kısa bir cevap geldiği için bir tane sundum. Ayrıca, bir çözeltisinin IMO olması muhtemel değildir. O(N)
pratyaksh

3

Aradığın şey değil. Ancak sadece bilgi paylaşımı amacıyla , her bir tepe noktasının işlemci olarak çalıştığını varsayarsanız, mesajları ile bunu yapabilirsiniz . Her tepe noktasının karşılaştırılabilir bir değere sahip olduğuna dikkat edin. Bu nedenle, tüm komşularından daha büyük olacak şekilde bazı köşeler vardır. Bu köşeler aşağıdakileri yapar:O(|E|)

  1. Let maksimum küçük komşu olmak ,vuv
  2. bir mesaj gönderin ve çıkışa kenar ekleyin .( v , u )u(v,u)
  3. Her komşu için ve ve (ve de daha küçük), kapsamamaktadır çıktı.u v ( v , w )wuv(v,w)
  4. Vertex daha küçük bir komşusu için tüm kenar çıktıya dahil edilinceye veya dahil edilmedikçe adımları tekrarlayın .v v(v,v)vv

Şimdi, bir düğümü her daha büyük komşundan (yani tüm kenarlar bir mesaj aldıysa veya dahil değilse, düğümü , mahalledeki en büyükmiş gibi davranır. daha önce bahsedilen 4 adım.( v , v ) vv(v,v)v

Bu algoritma dağıtılmış bir ortamda iletilerinde sonlanır . Bunun istediğin şey olmadığını biliyorum.O(|E|)


1

Lemma: V -> Y kenarı varsa ve Y de V'nin dolaylı ardılıysa (örneğin, V -> W -> + Y), o zaman V -> Y kenarı geçişlidir ve geçiş kökünün bir parçası değildir.

Yöntem: Terminalden başlangıç ​​köşelerine ters topolojik sırayla çalışarak, her bir tepe noktasının geçişli kapanışını takip edin. V'nin dolaylı ardılları seti, V'nin yakın ardıllarının geçişli kapanışlarının birliğidir. V'nin geçişli kapanışı, dolaylı haleflerinin ve yakın ardıllarının birliğidir.

Algoritma:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

Bu, köşe kümelerini (örneğin, bit haritaları) takip etmenin etkili bir yoluna sahip olduğunuzu varsayar, ancak bu varsayımın diğer O (V + E) algoritmalarında da yapıldığını düşünüyorum .

Potansiyel olarak faydalı bir yan etki, G'nin her bir tepe noktasının geçişli kapanışını bulmasıdır.


Önceki hesabınıza gönderilen yanıtı sildim. Hala iki hesabınızı birleştirmek istiyorsanız, lütfen yardım merkezindeki adımları izleyin . Bununla birlikte, önceki hesapta görünür içerik olmadığı için yeni hesaba sadık kalabilirsiniz.
Gilles 'SO- kötü olmayı kes

0

Aynı problemi çözdüm ama tam olarak aynı değildi. İndirgeme sonrasında grafikte minimum kenar sayısı isteniyor, böylece başlangıçta bağlı olan köşeler hala bağlı ve yeni bağlantı yapılmadı. Açıkça görüldüğü gibi, azaltılmış grafiği bulmak değil, kaç tane yedek kenarın mevcut olduğu söylenebilir. Bu problem O (V + E) ile çözülebilir. Açıklama bağlantısı https://codeforces.com/blog/entry/56326'dır . Ama grafiği gerçekten yapmayı düşünüyorum, O (N) 'den daha yüksek karmaşıklığa sahip olacak

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.