솔직히, 나는 이것이 아직 묻지 않았다는 것을 믿을 수는 없지만 여기에 있습니다.
배경
단순한 무 방향 평면 (교차없이 평면에 그래프를 그릴 수 있음) 그래프가 주어지면 그래프가 4 색인 것으로 입증 된 이론입니다. 그러나 그래프를 5 색으로 표시하는 것이 훨씬 쉬워 오늘날 과제에 집중할 것입니다.
그래프의 유효한 k 색상은 다음 속성을 사용하여 그래프의 노드에 "색상"을 할당하는 것입니다.
- 두 노드가 가장자리로 연결되어 있으면 노드의 색상이 달라집니다.
- 그래프 전체에 최대 5 개의 색상이 있습니다.
이것이 주어지면 간단한 무 방향 평면 그래프를 5 색으로 표시하는 매우 기본적인 알고리즘을 제시 할 것입니다. 이 알고리즘에는 다음 정의가 필요합니다.
도달 가능성 : 노드 1이 노드 2에서 도달 할 수있는 경우, 첫 번째 노드가 노드 2이고 마지막이 노드 1이되도록 각 노드가 다음 가장자리에 연결된 일련의 노드가 있음을 의미합니다. 노드 1에서 노드 1에 도달 할 수 있으면 노드 1에서 도달 할 수 있습니다.
Subgraph : 주어진 노드 집합 N의 그래프의 서브 그래프는 서브 그래프의 노드가 모두 N에 있고 두 노드가 모두 에지에 의해 연결된 경우에만 원래 그래프의 가장자리가 서브 그래프에있는 그래프입니다 N에 있습니다.
Color (N)을 5 개의 색상으로 N 개의 노드로 평면 그래프를 색칠하는 함수로 둡니다. 아래 함수를 정의합니다
- 연결된 노드 수가 가장 적은 노드를 찾으십시오. 이 노드에는 최대 5 개의 노드가 연결됩니다.
- 그래프에서이 노드를 제거하십시오.
- 이 새 그래프에서 Color (N-1)를 호출하여 색상을 지정하십시오.
- 삭제 된 노드를 다시 그래프에 추가하십시오.
- 가능하면 추가 된 노드에 연결된 노드 중 아무 것도없는 색을 채색하십시오.
- 가능하지 않은 경우 추가 된 노드에 인접한 5 개의 모든 노드는 5 가지 색상을 가지므로 다음 프로세스를 시도해야합니다.
- 추가 된 노드 n1 ... n5를 둘러싸는 노드의 번호를 매 깁니다
- 원래 그래프에서 n1 또는 n3과 같은 색으로 표시된 모든 노드의 하위 그래프를 고려하십시오.
- 이 하위 그래프에서 n1에서 n3에 도달 할 수없는 경우 n1에서 도달 할 수있는 노드 세트 (n1 포함)에서 n1의 모든 색상 발생을 n3으로 바꾸고 그 반대의 경우도 마찬가지입니다. 이제 추가 된 노드 n1의 원래 색상을 채 웁니다.
- 이 새 그래프에서 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에 대한 멋진 점입니다! 그러나 누군가가 더 결정론적인 알고리즘을 골프로 삼을 수 있다면 그것은 매우 시원 할 것입니다.
5
하여 4
다시 제출할 수없는 방식으로 설계되어야 합니다.