Grafiğim Düzlemsel mi?


29

Görevin bir grafiğin düzlemsel olup olmadığını belirlemektir.

Düzlem içine gömülebiliyorsa, başka bir deyişle, herhangi bir geçiş kenarı olmadan çizilebiliyorsa, grafik düzlemseldir.

Giriş: Size aşağıdaki formatları seçtiğinizde yönlendirilmemiş bir grafik verilecektir:

  • Kenar listesi, örneğin [(0, 1), (0, 2), (0, 3)]

  • Bitişik harita, örneğin {0: [1, 2, 3], 1:[0], 2:[0], 3:[0]}

  • Bitişik matris, örneğin [[0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

Düğüm adları sayılar, dizeler veya benzeri olabilir, ancak seçtiğiniz biçim, isteğe bağlı bir grafiği destekleyebilmelidir. Düğüm adlarına kod koymak yok. Kendini döngü olmayacak.

STDIN, komut satırı argümanları ve işlev argümanları dahil standart girdi seçimi.

Çıktı: Tüm düzlemsel grafikler için belirli bir çıktı ve tüm düzlemsel olmayan grafikler için farklı bir özel çıktı döndürmelisiniz.

STDOUT, fonksiyon dönüş değeri de dahil olmak üzere standart çıkış seçimi.

Örnekler:

Düzlemsel:

[]
[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6)]
[(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)]
[(0,2), (0,3), (0,4), (0,5), (1,2), (1,3), (1,4), (1,5), (2,3),
 (2,5), (3,4), (4,5)]

düzlemsel olmayan:

[(0,1), (0,2), (0,3), (0,4), (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]
[(0,3), (0,4), (0,5), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5)]
[(0,3), (0,4), (0,6), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (5,6), 
 (7,8), (8,9), (7,9)]

Açıkça düzlemsellik testi yapan veya başka bir şekilde düzlemsel yerleştirmelere referans veren herhangi bir fonksiyona izin verilmez.

Bu kod golfü. En kısa kod kazansın.


Güzel soru !

Bunun klasik bir problem olması harika ve hala normal amaçlar için kodda kullanılmayanlar da dahil olmak üzere birkaç olası yaklaşım var.
lirtosiast

Bir düzlemsel ve bir düzlemsel olmayan bağlı bileşene sahip bağlanmamış bir grafik için bir test durumu iyi olacaktır.
Peter Taylor

@PeterTaylor Tabii, bir tane ekleyeceğim.
isaacg

5
@RenaeLider Üzgünüz, ama anlamıyorum. Sorunun hiçbir şekilde kayan nokta sayılarıyla ilgisi yok - sayıları kullanmıyor, gerçekten, sadece etiketleri.
isaacg

Yanıtlar:


14

Mathematica, 201 bayt

f@g_:=EdgeCount@g<9||!(h=g~IsomorphicGraphQ~CompleteGraph@#&)@5&&!h@{3,3}&&And@@(f@EdgeDelete[g,#]&&f@EdgeContract[g,#]&/@EdgeList@g);And@@(f@Subgraph[g,#]&/@ConnectedComponents[g=Graph[#<->#2&@@@#]])&

Bu, gibi bir kenar listesi alan adsız bir işlevi değerlendirir

{{0, 3}, {0, 4}, {0, 5}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}}

Bu, Wagner teoremine dayanan, korkunç derecede verimsiz bir özyinelemeli yaklaşımdır :

Sonlu bir grafik, eğer sadece K 5 veya K 3,3 değilse küçük ise düzlemseldir .

Burada K 5 , 5 köşeli bir grafiktir ve K 3,3 , her grupta 3 köşeli bir bipartite grafiğidir. Bir grafik bir a, minör Grafik, B bu elde edilebilir, eğer B kenar silme ve kenar kasılmaları dizisi ile.

Grafiği izomorftur eğer bu kod sadece denetler Yani K 5 veya K 3,3 ve daha sonra yinelemeli olası her kenar silme veya daralma için bir kere kendisini çağıran değilse.

Yakalama, bağlanmamış bir grafiğin bir bileşeninde kenarları silmenin ya da daraltmanın, oradaki tüm köşelerden asla kurtulmaması, dolayısıyla istenen izomorfizmaları asla bulamayacağız. Bu nedenle, bu aramayı giriş grafiğinin bağlı her bileşenine ayrı olarak uygularız.

Bu, verilen girişler için çok hızlı çalışır, ancak birkaç daha fazla kenar eklerseniz, çok hızlı bir şekilde uzun sürecektir (ve ayrıca çok fazla bellek de çekecektir).

İşte girintili bir sürüm f(girişten sadece bir grafik nesnesi oluşturduktan sonra adlandırılmamış işlev:

f@g_ := 
  EdgeCount@g < 9 || 
  ! (h = g~IsomorphicGraphQ~CompleteGraph@# &)@5 && 
  ! h@{3, 3} &&
  And @@ (f@EdgeDelete[g, #] && f@EdgeContract[g, #] & /@ EdgeList@g)

Ve bu, girişi bir grafiğe dönüştüren ve fbağlı her bileşen için çağıran adsız işlevdir :

And @@ (
  f @ Subgraph[g, #] & /@ ConnectedComponents[
    g=Graph[# <-> #2 & @@@ #]
  ]
)&

Ben gelen fesih durumu değiştirerek bayt bir çift kaydedebilirsiniz EdgeCount@g<9için g==Graph@{}, ama bu anlamlı çalışma zamanını havaya uçar. İkinci test durumu daha sonra 30 saniye sürer ve sonuncusu henüz tamamlanmadı.


En #0saf fonksiyona atıfta bulunularak adlandırılmış fonksiyonu kullanmayı deneyebilir ve kaldırabilirsiniz .
LegionMammal978

@ LegionMammal978 Biliyorum, ancak hiçbir şey kaydetmiyor çünkü parantezlere ihtiyacım var ve ayrıca #bir değişkene gmanuel olarak atamam gerekiyor .
Martin Ender
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.