그래프 5 색


14

솔직히, 나는 이것이 아직 묻지 않았다는 것을 믿을 수는 없지만 여기에 있습니다.

배경

단순한 무 방향 평면 (교차없이 평면에 그래프를 그릴 수 있음) 그래프가 주어지면 그래프가 4 색인 것으로 입증 된 이론입니다. 그러나 그래프를 5 색으로 표시하는 것이 훨씬 쉬워 오늘날 과제에 집중할 것입니다.

그래프의 유효한 k 색상은 다음 속성을 사용하여 그래프의 노드에 "색상"을 할당하는 것입니다.

  1. 두 노드가 가장자리로 연결되어 있으면 노드의 색상이 달라집니다.
  2. 그래프 전체에 최대 5 개의 색상이 있습니다.

이것이 주어지면 간단한 무 방향 평면 그래프를 5 색으로 표시하는 매우 기본적인 알고리즘을 제시 할 것입니다. 이 알고리즘에는 다음 정의가 필요합니다.

도달 가능성 : 노드 1이 노드 2에서 도달 할 수있는 경우, 첫 번째 노드가 노드 2이고 마지막이 노드 1이되도록 각 노드가 다음 가장자리에 연결된 일련의 노드가 있음을 의미합니다. 노드 1에서 노드 1에 도달 할 수 있으면 노드 1에서 도달 할 수 있습니다.

Subgraph : 주어진 노드 집합 N의 그래프의 서브 그래프는 서브 그래프의 노드가 모두 N에 있고 두 노드가 모두 에지에 의해 연결된 경우에만 원래 그래프의 가장자리가 서브 그래프에있는 그래프입니다 N에 있습니다.

Color (N)을 5 개의 색상으로 N 개의 노드로 평면 그래프를 색칠하는 함수로 둡니다. 아래 함수를 정의합니다

  1. 연결된 노드 수가 가장 적은 노드를 찾으십시오. 이 노드에는 최대 5 개의 노드가 연결됩니다.
  2. 그래프에서이 노드를 제거하십시오.
  3. 이 새 그래프에서 Color (N-1)를 호출하여 색상을 지정하십시오.
  4. 삭제 된 노드를 다시 그래프에 추가하십시오.
  5. 가능하면 추가 된 노드에 연결된 노드 중 아무 것도없는 색을 채색하십시오.
  6. 가능하지 않은 경우 추가 된 노드에 인접한 5 개의 모든 노드는 5 가지 색상을 가지므로 다음 프로세스를 시도해야합니다.
  7. 추가 된 노드 n1 ... n5를 둘러싸는 노드의 번호를 매 깁니다
  8. 원래 그래프에서 n1 또는 n3과 같은 색으로 표시된 모든 노드의 하위 그래프를 고려하십시오.
  9. 이 하위 그래프에서 n1에서 n3에 도달 할 수없는 경우 n1에서 도달 할 수있는 노드 세트 (n1 포함)에서 n1의 모든 색상 발생을 n3으로 바꾸고 그 반대의 경우도 마찬가지입니다. 이제 추가 된 노드 n1의 원래 색상을 채 웁니다.
  10. 이 새 그래프에서 n1에서 n3에 도달 할 수있는 경우 n1 및 n3이 아닌 노드 n2 및 n4에서 9 단계부터 프로세스를 수행하십시오.

도전

에지리스트 (그래프를 나타냄)의 입력이 주어지면 각 노드에 값을 지정하여 그래프의 색상을 지정하십시오.

입력 : 그래프의 에지의리스트 (즉, [('a','b'),('b','c')...])

입력 에지리스트는 (a, b)가 목록에 있으면 (b, a)가 목록에없는 것과 같습니다.

출력 : 각각의 쌍의 첫 번째 요소는 노드 값의 쌍을 포함하는 객체 및 두 번째 색, 즉, [('a',1),('b',2)...]또는{'a':1,'b':2,...}

숫자, 문자, 기타 색을 표현하기 위해 무엇이든 사용할 수 있습니다.

입력과 출력이 무엇인지 분명한 한 입력과 출력은 매우 유연합니다.

규칙

  • 이것은 도전입니다
  • 위에서 설명한 알고리즘을 사용할 필요는 없습니다. 그것은 단지 참조를 위해 존재합니다.
  • 어떤 그래프 든, 그것들을 색칠하는 유효한 방법이 많이 있습니다. 알고리즘에서 생성 한 채색이 유효하다면 허용됩니다.
  • 그래프는 5 색이어야합니다.

테스트 사례

채색 결과의 유효성을 테스트 하려면 다음 코드 를 사용하십시오 . 그래프 당 유효한 그래프 채색이 많이 있으므로이 알고리즘은 채색의 유효성을 간단히 검사합니다. 코드 사용 방법은 docstring을 참조하십시오.

임의의 (그리고 다소 어리석은) 테스트 사례 :

테스트 사례 2 : Krackhardt Kite Graph [(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)]

유효한 출력 : {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

참고 :이 테스트 사례는 너무 작아서 채색 알고리즘의 미묘한 동작을 테스트 할 수 없으므로 자신의 그래프를 구성하는 것이 작업의 유효성을 테스트하는 데 적합합니다.

참고 2 : 컬러링 솔루션을 곧 그래프화할 다른 코드를 추가하겠습니다.

참고 3 : 나는 제시 된 임의의 채색 알고리즘을 보지 못했습니다 .PPCG에 대한 멋진 점입니다! 그러나 누군가가 더 결정론적인 알고리즘을 골프로 삼을 수 있다면 그것은 매우 시원 할 것입니다.


3
Petersen과 Chvatal 그래프가 비평면이 아닙니까?
Kroppeb

1
@NicHartley 그래프를 효과적으로 채색하는 인접 행렬에 대한 조옮김 기반 연산이 잘 알려져 있습니다. 종이를 찾으면 종이를 첨부하겠습니다.
Don Thousand

1
솔루션이 다항식 시간으로 제한하거나 솔루션이 사용자가 생각한 것 같은 그래프 알고리즘을 사용하도록 강제하기 위해 큰 테스트 사례를 실행하는 것이 더 나을 것이라고 생각합니다.
xnor

2
@ xnor 나는 나의 교훈을 배운 것 같습니다. 그 괜찮아요! 상자 밖으로 생각하는 것은 불이익이 아니라 보상되어야합니다.
Don Thousand

1
예, 알고 있습니다. 그러나 4 가지 색상의 질문은 사람들이이 질문에 대한 답변을 보거나로 변경 5하여 4다시 제출할 수없는 방식으로 설계되어야 합니다.
피터 테일러

답변:


6

파이썬 2 , 96 바이트

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)

온라인으로 사용해보십시오!

giccc

입력은 평면이므로 4 색을 찾는 것이 항상 가능합니다.

(따라서 이것은 어휘 적으로 가장 빠른 색소를 찾아서 매우 비효율적으로 만듭니다.)

ki4kmod4k나는


좋은 노력이지만 한 가지 구성 요소가 빠져 있다고 생각합니다. 노드가 5 가지 색상으로 둘러싸인 경우는 어떻습니까?
Don Thousand

이 문제를 해결하기 위해 테스트 사례를 작성하려고합니다
Don Thousand

그래프에서 주어진 노드가 5 개의 다른 노드로 둘러싸여 있다고 가정 해 봅시다. 이미 5 개의 색상을 허용했습니다.
Don Thousand

1
내 코드는 무작위로 그래프 채색 을 생성하고 올바른 그래프 채색을 생성 할 때까지 확인한 다음 종료시 인쇄합니다. 이 경우에는 처음부터 다시 시작하여 5 개의 가능한 모든 5 개의 노드에 색상을 지정하지 않기를 바랍니다.
Lynn

2
이제 모든 색소를 사전 식 순서로 확인합니다 :) 결정적이고 O (5 ^ n)이지만 대부분의 입력에 대해 훨씬 느립니다.
Lynn

3

자바 스크립트 (ES7), 80 76 74 바이트

@Neil 덕분에 2 바이트 절약

Lynn 과 같은 접근 방식 . 0 에서 3 까지 번호가 매겨진 4 가지 색상으로 해결 합니다.

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

온라인으로 사용해보십시오!


당신이 4 색을 허용한다면, 왜 안돼 x>>n+n&3?
Neil

@ Neil 아 네, 감사합니다. 나는 5 가지 색채에 대한 설명에 산만 해졌고 입력이 4에서 풀릴 수 있다는 것을 잊었다.
Arnauld

3

Brachylog , 38 바이트

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

온라인으로 사용해보십시오!

설명

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

파이썬 2 , 211 바이트

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

온라인으로 사용해보십시오!

결정 론적! 더 복잡한 테스트 사례에서는 실패 할 수 있지만 실패한 그래프를 찾기에는 너무 불타고 있습니다. 더 많은 테스트 사례 및 / 또는 비판을 환영합니다!


1

클린 , 139 바이트

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]

온라인으로 사용해보십시오!

모든 채색을 생성하고 첫 번째 유효한 채색을 반환합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.