내 그래프는 평면입니까?


29

당신의 작업은 그래프가 평면인지 여부를 결정하는 것입니다.

평면에 포함 할 수있는 경우 그래프, 즉 가장자리가 교차하지 않고 그릴 수있는 경우에는 평면입니다.

입력 : 다음 형식 중에서 선택한 무 방향 그래프가 제공됩니다.

  • 에지리스트 [(0, 1), (0, 2), (0, 3)]

  • 인접도, 예 : {0: [1, 2, 3], 1:[0], 2:[0], 3:[0]}

  • 인접 매트릭스, 예 : [[0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

노드 이름은 숫자, 문자열 또는 유사 할 수 있지만 선택한 형식은 임의의 그래프를 지원할 수 있어야합니다. 노드 이름에 코드를 넣지 마십시오. 자체 루프가 없습니다.

STDIN, 명령 행 인수 및 함수 인수를 포함한 표준 입력 선택.

출력 : 모든 평면 그래프에 대한 특정 출력과 모든 비평면 그래프에 대해 다른 특정 출력을 반환해야합니다.

STDOUT, 함수 반환 값을 포함한 표준 출력 선택.

예 :

평면 :

[]
[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6)]
[(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)]
[(0,2), (0,3), (0,4), (0,5), (1,2), (1,3), (1,4), (1,5), (2,3),
 (2,5), (3,4), (4,5)]

비평면 :

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

평면성 테스트를 명시 적으로 수행하거나 특별히 평면 임베딩을 참조하는 기능은 허용되지 않습니다.

이것은 코드 골프입니다. 가장 짧은 코드가 이길 수 있습니다.


좋은 질문입니다!

이것이 고전적인 문제이며 일반적인 목적으로 코드에서 사용되지 않는 방법을 포함하여 몇 가지 가능한 접근법이 여전히 있습니다.
lirtosiast

하나의 평면과 하나의 비평면으로 연결된 구성 요소가있는 비 연결 그래프의 테스트 사례가 좋습니다.
피터 테일러

@PeterTaylor 물론 추가하겠습니다.
isaacg 2016 년

5
@RenaeLider 죄송하지만 이해가되지 않습니다. 이 질문은 부동 소수점 숫자와는 전혀 관련이 없습니다. 숫자조차 사용하지 않으며 실제로 레이블 만 사용합니다.
isaacg 2016 년

답변:


14

수학, 201 바이트

f@g_:=EdgeCount@g<9||!(h=g~IsomorphicGraphQ~CompleteGraph@#&)@5&&!h@{3,3}&&And@@(f@EdgeDelete[g,#]&&f@EdgeContract[g,#]&/@EdgeList@g);And@@(f@Subgraph[g,#]&/@ConnectedComponents[g=Graph[#<->#2&@@@#]])&

이것은 명명되지 않은 함수로 평가되며,

{{0, 3}, {0, 4}, {0, 5}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}}

이것은 Wagner의 정리 에 기반한 끔찍하게 비효율적 인 재귀 접근법입니다 .

유한 그래프는 K 5 또는 K 3,3 이 마이너로 없는 경우에만 평면 입니다.

여기서 K 5 는 5 개의 정점이있는 완전한 그래프이고, K 3,3 은 각 그룹에 3 개의 정점이있는 완전한 이분 그래프입니다. 그래프 A 는 에지 삭제 및 에지 수축의 시퀀스에 의해 B 로부터 획득 될 수있는 경우 , 그래프 B 이다 .

따라서이 코드는 그래프가 K 5 또는 K 3,3에 동형인지 확인 하고 그렇지 않은 경우 가능한 모든 가장자리 삭제 또는 축소에 대해 재귀 적으로 한 번 호출합니다.

연결되지 않은 그래프의 한 구성 요소에서 가장자리를 삭제하거나 축소하면 거기에있는 모든 정점이 제거되지 않으므로 원하는 동형이 발견되지 않습니다. 따라서이 검색을 입력 그래프의 연결된 각 구성 요소에 개별적으로 적용합니다.

이것은 주어진 입력에 대해 매우 빠르게 작동하지만 가장자리를 몇 개 더 추가하면 치명적으로 오래 걸리고 많은 메모리가 필요합니다.

다음은 들여 쓰기 버전입니다 f(입력에서 그래프 객체를 생성 한 후 명명되지 않은 함수).

f@g_ := 
  EdgeCount@g < 9 || 
  ! (h = g~IsomorphicGraphQ~CompleteGraph@# &)@5 && 
  ! h@{3, 3} &&
  And @@ (f@EdgeDelete[g, #] && f@EdgeContract[g, #] & /@ EdgeList@g)

그리고 이것은 입력을 그래프로 변환하고 f연결된 각 구성 요소를 호출하는 명명되지 않은 함수입니다 .

And @@ (
  f @ Subgraph[g, #] & /@ ConnectedComponents[
    g=Graph[# <-> #2 & @@@ #]
  ]
)&

종료 조건을에서 EdgeCount@g<9로 변경하여 몇 바이트를 절약 할 수 g==Graph@{}있지만 런타임이 크게 줄어 듭니다. 두 번째 테스트 케이스는 30 초가 걸리고 마지막 테스트 케이스는 아직 완료되지 않았습니다.


#0가장 순수한 함수 를 나타내는 명명 된 함수를 사용하여 제거 할 수 있습니다.
LegionMammal978

@ LegionMammal978 알고 있지만 실제로 아무것도 저장하지 않습니다. 왜냐하면 괄호가 필요 #하고 변수에 g수동으로 할당해야하기 때문 입니다.
Martin Ender 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.