Đồ thị 5 màu


14

Thành thật mà nói, tôi không thể tin rằng điều này chưa được hỏi, nhưng đây là

Lý lịch

Với một mặt phẳng vô hướng đơn giản (đồ thị có thể được vẽ trong mặt phẳng không có giao điểm), một định lý đã được chứng minh rằng đồ thị có 4 màu, một thuật ngữ chúng ta sẽ khám phá trong một chút. Tuy nhiên, việc vẽ đồ thị 5 màu dễ dàng hơn nhiều, đó là những gì chúng ta sẽ tập trung vào thử thách ngày hôm nay.

Màu k hợp lệ của biểu đồ là việc gán "màu" cho các nút của biểu đồ với các thuộc tính sau

  1. Nếu hai nút được kết nối bởi một cạnh, các nút được tô màu với các màu khác nhau.
  2. Trên biểu đồ, có tối đa 5 màu.

Với điều này, tôi sẽ trình bày cho bạn một thuật toán khá cơ bản để 5 màu cho bất kỳ đồ thị phẳng không mong muốn đơn giản nào. Thuật toán này yêu cầu các định nghĩa sau

Khả năng tiếp cận : Nếu nút 1 có thể truy cập được từ nút 2, điều đó có nghĩa là có một chuỗi các nút, mỗi nút được kết nối với cạnh tiếp theo, sao cho nút đầu tiên là nút 2 và nút cuối cùng là nút 1. Lưu ý rằng vì đồ thị vô hướng là đối xứng, nếu nút 1 có thể truy cập được từ nút 2, thì nút 2 có thể truy cập được từ nút 1.

Đồ thị con : Một đồ thị con của một đồ thị của một tập hợp các nút N là một đồ thị nơi các nút của đồ thị con là tất cả trong N, và một cạnh từ biểu đồ ban đầu là trong đồ thị con khi và chỉ khi cả hai nút được nối với nhau bằng cạnh đang ở N.

Đặt Color (N) là một hàm để tô màu đồ thị phẳng với N nút có 5 màu. Chúng tôi xác định chức năng dưới đây

  1. Tìm nút có số lượng nút ít nhất được kết nối với nó. Nút này sẽ có tối đa 5 nút được kết nối với nó.
  2. Loại bỏ nút này khỏi biểu đồ.
  3. Gọi Màu (N-1) trên biểu đồ mới này để tô màu.
  4. Thêm nút bị xóa trở lại biểu đồ.
  5. Nếu có thể, tô màu cho nút được thêm một màu mà không có nút nào được kết nối của nó có.
  6. Nếu không thể, thì tất cả 5 nút lân cận cho nút được thêm có 5 màu khác nhau, vì vậy chúng ta phải thử quy trình sau.
  7. Đánh số các nút xung quanh nút được thêm n1 ... n5
  8. Hãy xem xét sơ đồ con của tất cả các nút trong biểu đồ gốc có màu giống như n1 hoặc n3.
  9. Nếu trong sơ đồ con này, n3 không thể truy cập được từ n1, trong tập hợp các nút có thể truy cập từ n1 (bao gồm n1), thay thế tất cả các lần xuất hiện của màu n1 bằng n3 và ngược lại. Bây giờ tô màu màu gốc của nút n1.
  10. Nếu n3 có thể truy cập từ n1 trong biểu đồ mới này, hãy thực hiện quy trình từ bước 9 trên các nút n2 và n4, thay vì n1 và n3.

Thử thách

Đưa ra một đầu vào của một edgelist (đại diện cho một biểu đồ), tô màu cho biểu đồ, bằng cách gán cho mỗi nút một giá trị.

Đầu vào : Một danh sách các cạnh trong biểu đồ (nghĩa là [('a','b'),('b','c')...])

Lưu ý rằng edgelist đầu vào sẽ sao cho nếu (a, b) nằm trong danh sách, (b, a) KHÔNG có trong danh sách.

Đầu ra : Một đối tượng chứa các cặp giá trị, trong đó phần tử đầu tiên của mỗi cặp là một nút và màu thứ hai của nó, nghĩa là, [('a',1),('b',2)...]hoặc{'a':1,'b':2,...}

Bạn có thể sử dụng bất cứ thứ gì để thể hiện màu sắc, từ số, đến ký tự, cho bất cứ thứ gì khác.

Đầu vào và đầu ra khá linh hoạt, miễn là nó khá rõ ràng đầu vào và đầu ra là gì.

Quy tắc

  • Đây là một thử thách
  • Bạn không phải sử dụng thuật toán mà tôi đã mô tả ở trên. Nó chỉ đơn giản là có để tham khảo.
  • Đối với bất kỳ biểu đồ, thường có nhiều phương pháp tô màu hợp lệ. Miễn là màu mà thuật toán của bạn tạo ra là hợp lệ, điều đó có thể chấp nhận được.
  • Hãy nhớ rằng đồ thị phải có 5 màu.

Các trường hợp thử nghiệm

Sử dụng sau đây để kiểm tra tính hợp lệ của kết quả tô màu của bạn. Vì có nhiều màu biểu đồ hợp lệ trên mỗi biểu đồ, thuật toán này chỉ đơn giản là kiểm tra tính hợp lệ của màu. Xem chuỗi doc để xem cách sử dụng mã.

Một số trường hợp thử nghiệm ngẫu nhiên (và khá ngớ ngẩn) :

Trường hợp thử nghiệm 2: Đồ thị diều Krackhardt [(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)]

Một đầu ra hợp lệ: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

Lưu ý : Những trường hợp thử nghiệm này quá nhỏ để kiểm tra hành vi nhiều sắc thái của thuật toán tô màu, do đó, việc xây dựng biểu đồ của riêng bạn có lẽ là một thử nghiệm tốt về tính hợp lệ của công việc của bạn.

Lưu ý 2 : Tôi sẽ thêm một đoạn mã khác sẽ sớm vẽ biểu đồ giải pháp tô màu của bạn.

Lưu ý 3 : Tôi đã không thấy các thuật toán tô màu ngẫu nhiên đã được trình bày, đó là điều tuyệt vời về PPCG! Tuy nhiên, nếu bất cứ ai cũng có thể chơi một thuật toán xác định hơn, điều đó cũng sẽ rất tuyệt.


3
Không phải là Petersen và đồ thị Chvirth nonplanar?
Kroppeb

1
@NicHartley Có các hoạt động chuyển vị nổi tiếng dựa trên ma trận kề, có hiệu quả đồ thị màu. Tôi sẽ đính kèm một tờ giấy khi tôi tìm thấy.
Don Ngàn

1
Tôi nghĩ rằng bạn nên hạn chế các giải pháp trong thời gian đa thức hoặc yêu cầu một trường hợp thử nghiệm lớn để chạy thành công để buộc các giải pháp sử dụng thuật toán đồ thị như những gì bạn nghĩ.
xnor

2
@xnor Tôi dường như đã học được bài học của mình. Không sao đâu! Suy nghĩ ra khỏi hộp nên được khen thưởng, không bị phạt.
Don Ngàn

1
Vâng, tôi biết, nhưng một câu hỏi 4 màu sẽ phải được thiết kế theo cách như vậy mà người ta không thể chỉ mất câu trả lời của họ cho câu hỏi này, thay đổi 5đến 4, và gửi lại chúng.
Peter Taylor

Câu trả lời:


6

Python 2 , 96 byte

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)

Hãy thử trực tuyến!

Đầu vào là giccc

Đầu vào là phẳng, vì vậy việc tìm kiếm 4 màu luôn luôn có thể.

(Do đó: điều này tìm thấy màu sắc từ vựng sớm nhất theo một nghĩa nào đó, và làm như vậy rất không hiệu quả.)

ki4kmod4ki


Nỗ lực tốt đẹp, nhưng tôi tin rằng bạn đang thiếu một thành phần. Còn trường hợp một nút được bao quanh bởi 5 màu khác nhau thì sao?
Don Ngàn

Tôi sẽ cố gắng xây dựng một trường hợp thử nghiệm để phá vỡ điều này
Don Nghìn

Giả sử rằng một nút đã cho trong biểu đồ của bạn được bao quanh bởi 5 nút khác, bạn đã tô màu 5 màu bạn được phép.
Don Ngàn

1
Mã của tôi tạo ngẫu nhiên các màu biểu đồ và kiểm tra chúng cho đến khi nó tạo ra một màu biểu đồ chính xác, sau đó nó sẽ in ra khi thoát. Trong trường hợp bạn mô tả, nó sẽ bắt đầu lại và hy vọng không tô màu cho 5 nút đó cả 5 màu có sẵn.
Lynn

2
Bây giờ nó kiểm tra tất cả các màu theo thứ tự từ điển :) vì vậy nó mang tính quyết định và O (5 ^ n), nhưng chậm hơn rất nhiều đối với hầu hết các đầu vào.
Lynn

3

JavaScript (ES7), 80 76 74 byte

Đã lưu 2 byte nhờ @Neil

Cách tiếp cận tương tự như Lynn . Giải quyết trong 4 màu, được đánh số từ 0 đến 3 .

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

Hãy thử trực tuyến!


Nếu bạn được phép tô 4 màu thì tại sao không x>>n+n&3?
Neil

@Neil À đúng rồi, cảm ơn. Tôi đã bị phân tâm bởi lời giải thích về 5 màu và quên đầu vào được đảm bảo có thể giải được trong 4.
Arnauld

3

Brachylog , 38 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

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

Hãy thử trực tuyến!

Quyết đoán! Có thể thất bại trong các trường hợp thử nghiệm phức tạp hơn, nhưng tôi quá mệt mỏi khi tìm thấy một biểu đồ mà nó thất bại. Nhiều trường hợp thử nghiệm và phê bình.


1

Sạch , 139 byte

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]

Hãy thử trực tuyến!

Tạo tất cả các màu và trả về cái hợp lệ đầu tiên.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.