Grafik 5-Boyama


14

Dürüst olmak gerekirse, bunun henüz sorulmamış olduğuna inanamıyorum, ama işte burada

Arka fon

Basit bir yönlendirilmemiş düzlemsel (grafik kavşak olmadan düzlemde çizilebilir) grafiği göz önüne alındığında , grafiğin biraz renklendirileceğimiz bir terim olan 4 renklendirilebilir olduğu kanıtlanmış bir teoremdir. Bununla birlikte, bir grafiği 5 renklendirmek çok daha kolay, bu da bugünkü mücadelemize odaklanacağız.

Bir grafiğin geçerli bir k-rengi, aşağıdaki özelliklere sahip grafiğin düğümlerine "renklerin" atanmasıdır

  1. İki düğüm bir kenarla bağlanırsa, düğümler farklı renklerle renklendirilir.
  2. Grafik boyunca en fazla 5 renk var.

Bunu göz önüne alarak, size herhangi bir basit yönlendirilmemiş düzlemsel grafiği 5 renk için oldukça basit bir algoritma sunacağım. Bu algoritma aşağıdaki tanımları gerektirir

Erişilebilirlik : Düğüm 1 düğüm 2'den erişilebiliyorsa, bu, her biri bir sonrakine bir kenarla bağlanan bir dizi düğüm olduğu anlamına gelir, böylece ilk düğüm düğüm 2 ve son düğüm düğüm 1 olur. simetriktir, eğer düğüm 1 düğüm 2'den erişilebilirse, düğüm 2 düğüm 1'den erişilebilir.

Alt grafik: Belirli bir düğüm kümesi N'nin grafiğinin alt grafiği, alt grafiğin düğümlerinin tümü N cinsindendir ve yalnızca her iki düğüm de kenara bağlıysa, alt grafikte bulunan bir grafiktir. N'de.

Renk (N), 5 renkli N düğümlü düzlemsel grafikleri renklendirmek için bir işlev olsun. Aşağıdaki fonksiyonu tanımlıyoruz

  1. En az sayıda düğümün bağlı olduğu düğümü bulun. Bu düğümde en fazla 5 düğüm bulunur.
  2. Bu düğümü grafikten kaldırın.
  3. Renklendirmek için bu yeni grafikte Renk (N-1) çağırın.
  4. Silinen düğümü grafiğe geri ekleyin.
  5. Mümkünse, eklenen düğüme bağlı düğümlerinden hiçbirinin sahip olmadığı bir rengi renklendirin.
  6. Mümkünse, eklenen düğüme komşu 5 düğümün 5 farklı rengi vardır, bu nedenle aşağıdaki işlemi denemeliyiz.
  7. Eklenen n1 ... n5 düğümünü çevreleyen düğümleri numaralandırın
  8. Orijinal grafikteki tüm düğümlerin alt grafiğini n1 veya n3 ile aynı renkte düşünün.
  9. Bu alt paragrafta, n3'e n1'den erişilemiyorsa, n1'den (n1 dahil) erişilebilen düğümler kümesinde, n1 renginin tüm örneklerini n3'lerle değiştirin veya tersini yapın. Şimdi eklenen düğüm n1'in orijinal rengini renklendirin.
  10. Bu yeni grafikte n3'e n1'den erişilebiliyorsa, n1 ve n3 yerine n2 ve n4 düğümlerinde adım 9'daki işlemi yapın.

Meydan okuma

Bir edgelistin (bir grafiği temsil eden) bir girdisi verildiğinde, her düğüme bir değer atayarak grafiği renklendirin.

Girdi : Grafikteki kenarların listesi (ör. [('a','b'),('b','c')...])

Giriş edgelistinin (a, b) listede varsa, (b, a) listede DEĞİL olacak şekilde olacağını unutmayın.

Çıktı : Her çiftin ilk elemanının bir düğüm ve ikincisinin rengi, yani [('a',1),('b',2)...]veya{'a':1,'b':2,...}

Rakamlardan karakterlere, başka herhangi bir şeye kadar renkleri temsil etmek için her şeyi kullanabilirsiniz.

Giriş ve çıkışların ne olduğu oldukça net olduğu sürece giriş ve çıkış oldukça esnektir.

kurallar

  • Bu bir mücadelesi
  • Yukarıda tarif ettiğim algoritmayı kullanmanıza gerek yok. Sadece referans için orada.
  • Herhangi bir grafik için, genellikle onları renklendirmek için birçok geçerli yöntem vardır. Algoritmanızın ürettiği renk geçerli olduğu sürece, bu kabul edilebilir.
  • Grafiğin 5 renkli olması gerektiğini unutmayın.

Test Durumları

Renklendirme sonuçlarınızın geçerliliğini test etmek için aşağıdaki kodu kullanın . Grafik başına birçok geçerli grafik renklendirme olduğundan, bu algoritma renklendirmenin geçerliliğini kontrol eder. Kodu nasıl kullanacağınızı görmek için doktora bakın.

Bazı rastgele (ve daha aptalca) test vakaları :

Test Örneği 2: Krackhardt Uçurtma Grafiği [(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]

Geçerli bir çıktı: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

Not : Bu test senaryoları, renklendirme algoritmasının daha incelikli davranışını test etmek için çok küçüktür, bu nedenle kendi grafiklerinizi oluşturmak muhtemelen işinizin geçerliliğinin iyi bir testidir.

Not 2 : Renklendirme çözümünüzü yakında çizecek başka bir kod parçası ekleyeceğim.

Not 3 : Sunulan rastgele renklendirme algoritmalarını görmedim, bu PPCG hakkında çok güzel olan şey! Bununla birlikte, daha belirleyici bir algoritma golf oynayabilirse, bu da çok havalı olurdu.


3
Petersen ve Chvatal grafiği düzlemsel değil mi?
Kroppeb

1
@NicHartley Bitişiklik matrisleri üzerinde grafikleri etkili bir şekilde renklendiren iyi bilinen transpozisyon tabanlı işlemler vardır. Bir tane bulduğumda bir kağıt ekleyeceğim.
Don Bin

1
Çözümleri polinom zamanıyla sınırlamaktan daha iyi olurdu veya çözümleri aklınızdaki gibi grafik algoritmalarını kullanmaya zorlamak için büyük bir test senaryosunun başarılı bir şekilde çalışmasını gerektiriyorsunuz.
xnor

2
@xnor Dersimi öğrendim. Sorun değil! Kutunun dışında düşünmek cezalandırılmamalı, ödüllendirilmelidir.
Don Bin

1
Evet, biliyorum, ama bir 4-boyama soru insanlar sadece bu soruya, değişime verdikleri yanıtları alamaz şekilde dizayn edilmesi gerekir 5için 4, ve tekrar göndermek.
Peter Taylor

Yanıtlar:


6

Python 2 , 96 bayt

i=0
g=input()
while 1:i+=1;c={k:i/4**k%4for k in sum(g,())};all(c[s]^c[t]for s,t in g)>0<exit(c)

Çevrimiçi deneyin!

giccc

Giriş düzlemseldir, bu nedenle 4 renklendirme bulmak her zaman mümkündür.

(Böylece: bu bir anlamda sözlükbilimsel olarak en eski rengi bulur ve bunu çok verimsiz yapar.)

kkii4kmod4ki


İyi bir çaba, ama bir bileşeni eksik olduğuna inanıyorum. Bir düğümün 5 farklı renkle çevrili olduğu durum ne olacak?
Don Bin

Bunu kırmak için bir test davası oluşturmaya çalışacağım
Don Bin

Grafiğinizdeki belirli bir düğümün, izin verdiğiniz 5 rengi daha önce renklendirdiğiniz diğer 5 düğümle çevrili olduğunu varsayalım.
Don Bin

1
Kodum rasgele grafik renklendirmeleri oluşturur ve doğru grafik renklendirmesi oluşana kadar bunları kontrol eder . Açıklamanız durumunda baştan başlayacak ve umarım bu 5 düğümü mevcut 5 rengin hepsine boyamazsınız.
Lynn

2
Şimdi tüm renkleri sözlükbilimsel sırayla kontrol ediyor :) bu yüzden deterministik ve O (5 ^ n), ancak çoğu girdi için çok daha yavaş.
Lynn

3

JavaScript (ES7), 80 76 74 bayt

@Neil sayesinde 2 bayt kaydedildi

Lynn ile aynı yaklaşım . 4 renk çözer, numaralandırılmış 0 ile 3 .

a=>{for(x=0;a.some(a=>a.map(n=>z=c[n]=x>>n*2&3)[0]==z,c={});x++);return c}

Çevrimiçi deneyin!


4 renklendirmeye izin verildiyse, neden olmasın x>>n+n&3?
Neil

@Neil Ah evet, teşekkürler. 5 renklendirme hakkında açıklama
dikkatimi dağıttım

3

Brachylog , 38 bayt

cd{∧4>ℕ}ᶻ.g;?z{tT&h⊇ĊzZhpT∧Zt≠}ᵐ∧.tᵐ≜∧

Çevrimiçi deneyin!

açıklama

Example input: [["a","b"],["c","b"]]

cd                                       Concatenate and remove duplicates: ["a","b","c"]
  {∧4>ℕ}ᶻ.                               The output is this list zipped zith integers that
                                           are in [0..4]: [["a",I],["b",J],["c",K]]
         .g;?z                           Zip the output with the input:
                                           [[[["a",I],["b",J],["c",K]],["a","b"]],[["a",I],["b",J],["c",K]],["c","b"]]
              {               }ᵐ∧        Map for each element
               tT                        Call T the couple of nodes denoting an edge
                 &h⊇Ċ                    Take a subset of 2 elements in the head
                     zZ                  Zip and call it Z
                      ZhpT               The nodes in Z are T up to a permutation
                          ∧Zt≠           The integers in Z are all different color
                                 .tᵐ≜∧   Label the integers (i.e. colors) in the output so that
                                           it matches the set constraints

1

Python 2 , 211 bayt

def f(g):
 g={k:[(a,b)[a==k]for a,b in g if k in(a,b)]for k in sum(g,())};c={k:0 for k in g}
 for a,b in sorted(g.iteritems(),key=lambda a:len(a[1])):c={k:(c[k],c[k]+1)[c[a]==c[k]and k in b]for k in c}
 return c

Çevrimiçi deneyin!

Deterministik! Muhtemelen daha karmaşık test durumlarında başarısız olur, ancak başarısız olduğu bir grafik bulmak için çok yanmışım. Daha fazla test vakası ve. Veya eleştiri hoş geldiniz!


1

Temiz , 139 bayt

import StdEnv,Data.List
$l#(a,b)=unzip l
#e=nub(a++b)
=hd[zip2 e c\\c<- ?e|all(\(a,b)=c!!a<>c!!b)l]
?[h:t]=[[n:m]\\n<-[0..4],m<- ?t]
?e=[e]

Çevrimiçi deneyin!

Tüm renklendirmeleri oluşturur ve ilk geçerli olanı döndürür.


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.