Bu ağaçlar izomorfik mi?


21

Giriş

Bu zorlukta göreviniz, verilen iki ağacın izomorfik olup olmadığına karar veren bir program yazmaktır. Bir ağaç, her düğümün, hiçbiri olmayan kök hariç, tam olarak bir çıkış kenarına sahip olduğu, yönlendirilmiş bir asiklik grafik anlamına gelir. İki ağaç, biri düğümleri yeniden adlandırarak biri diğerine dönüştürülebilirse izomorfiktir. Örneğin, iki ağaç (her kenarın işaret ettiği yer)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

kolayca izomorfik olduğu görülmektedir.

Bir ağacı Lnegatif olmayan tam sayıların bir listesi olarak aşağıdaki şekilde kodladık . Ağacın kökü etiketli 0ve ayrıca düğümleri var 1,2,...,length(L). Her düğümün (1 tabanlı bir dizin oluşturma kullanarak) i > 0için bir çıkış kenarı vardır L[i]. Örneğin, liste (elementlerin altında verilen endekslerle)

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

ağacı kodlar

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

Giriş

Girişleriniz, yerel formatta veya dilinizde verilen iki negatif olmayan tamsayı listesidir. İki ağacı yukarıda belirtilen şekilde kodlarlar. Onlar hakkında aşağıdaki koşulları kabul edebilirsiniz:

  1. Boş değiller.
  2. Aynı uzunluktalar.
  3. Her liste , tüm (1 tabanlı) endeksleri Lkarşılar .L[i] < ii

Çıktı

Ağaçlarınız izomorfik ise çıktınız eski bir değer, değilse de sahte bir değer olacaktır.

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez. Zaman kısıtlaması yoktur, ancak ağaç veya grafik izomorfizmine karar veren yerleşiklere izin verilmez.

Test durumları

Truthy örnekleri

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

Sahte örnekler

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


@DigitalTrauma dangit, sen ... Bir 60 bayt Mma çözümü vardı ... OP disallow yerleşiklerini yapılan
LegionMammal978

Yanıtlar:


2

Mathematica, 48 bayt

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

Kullanılan çözümden bile daha kısa IsomorphicGraphQ:

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Python, 83

2. satırdaki adsız işlev benim çözümüm.

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

fkanonlanmış çocuklarının sıralanmış bir listesi olan kanonlanmış bir alt ağacın biçimini döndürür. O zaman basitçe her ağacın kurallı biçimlerinin eşit olup olmadığını kontrol etmeliyiz.

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.