이분입니까?


13

된 그래프는 꼭지점에는 에지가 동일한 세트의 두 정점을 연결 없도록, 두 개의 분리 된 세트들로 분할 될 수있는 그래프이다. 그래프는 2 색인 경우에만 2 분할입니다.


도전

지시 되지 않은 단순 그래프 의 인접 행렬 이 주어진 경우이 그래프가 이분 그래프인지 여부를 결정해야합니다. 즉, 모서리가 정점 i와 j를 연결하는 경우 행렬의 (i, j)와 (j, i) 항목은 모두 1입니다.

그래프는 방향이없고 단순하기 때문에 인접 행렬은 대칭이며 0과 1 만 포함합니다.

사양

N-N-N 행렬을 입력으로 사용해야합니다 (예 : 목록 목록, 문자열 목록, C 유사 int**및 크기, 평평한 배열, 원시 입력 등).

그래프가 이분자 일 경우 함수 / 프로그램은 정확한 값을 반환 / 출력해야하며 그렇지 않으면 거짓입니다.

테스트 사례

['00101',
 '00010',
 '10001',
 '01000',
 '10100'] : False
['010100',
 '100011',
 '000100',
 '101000',
 '010000',
 '010000'] : True (divide into {0, 2, 4, 5} and {1, 3})
['00',
 '00'] : True

채점

답변을 직접 계산하는 빌트인은 금지되어 있습니다.

이것은 이므로 이번 달 말까지 가장 짧은 프로그램 (바이트)이 이깁니다!


관련 이분되는 것은 전혀 이상한 사이클이없는 동일합니다, 모든 사이클을 열거하고 자신의 길이를 검사하여 그 질문에 작업에 대한 답변의 대부분 때문에, 사실의 경계에 속는한다.
피터 테일러

@PeterTaylor 그래, 그러나이 문제를 해결하는 간단한 방법이 있습니다.
Colera Su

@ColeraSu 진실 / 거짓 대신 -1거짓과 거짓이 아닌 정수를 반환 할 수 있습니까?
Mr. Xcoder

@MishaLavrov- 0> Falsy, >0-> Truthy는 일반적으로 표준 진실 / 거짓 규칙에 의해 허용됩니다. -1그리고 ≥ 0내가 물어 그 이유는, 그 일반적인하지 않습니다.
Mr. Xcoder

@ Mr.Xcoder 괜찮습니다.
Colera Su

답변:


4

껍질 , 17 바이트

§V¤=ṁΣṠMSȯDfm¬ṀfΠ

그래프가이 분식이면 양의 정수를 인쇄합니다 0. 온라인으로 사용해보십시오!

설명

이는 무차별 대입 방식입니다. 정점의 모든 하위 집합 S 를 반복 하고 그래프의 모든 가장자리가 S 와 그 상보 사이에 있는지 확인합니다 .

§V¤=ṁΣṠMSȯDfm¬ṀfΠ  Implicit input: binary matrix M.
                Π  Cartesian product; result is X.
                   Elements of X are binary lists representing subsets of vertices.
                   If M contains an all-0 row, the corresponding vertex is never chosen,
                   but it is irrelevant anyway, since it has no neighbors.
                   All-1 rows do not occur, as the graph is simple.
      ṠM           For each list S in X:
              Ṁf   Filter each row of M by S, keeping the bits at the truthy indices of S,
        S  fm¬     then filter the result by the element-wise negation of S,
         ȯD        and concatenate the resulting matrix to itself.
                   Now we have, for each subset S, a matrix containing the edges
                   from S to its complement, twice.
§V                 1-based index of the first matrix
  ¤=               that equals M
    ṁΣ             by the sum of all rows, i.e. total number of 1s.
                   Implicitly print.

@ Mr.Xcoder 글쎄, M = [[1,2,3],[4,5,6],[7,8,9]]그리고 S = [1,0,1]( M프로그램에서 항상 이진 행렬이지만이 방법을 설명하는 것이 더 쉽습니다). 각 행의 필터링 M에 의해 S제공을 [[1,3],[4,6],[7,9]]어디에서 각 행에 대해, I는 해당 인덱스의 요소를 제거 S0을 갖는 것은 그럼 부정 S소자 현명 얻을 [0,1,0]및 필터 M그것에 의하여 취득하는 [[4,6]]: 첫 번째 및 마지막 행이 해당 인덱스 0을 이므로 제거됩니다.
Zgarb

17

Wolfram Language (Mathematica) , 26 25 바이트

Tr[#//.x_:>#.#.Clip@x]<1&

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

작동 원리

인접성 매트릭스 소정 우리 B = A에서 시작하여 그 다음으로 B를 대체하는 정점 발견 2 때때로 1 행 (k)를 1보다 큰 값을 클리핑 B 번째 이 프로세스의 단계를 동등한 최대 인 Clip힘을 발견하려면 2K + 1 (가)는 (i, j)는 항목 J 행 I 정점에서 길이 2K + 1 경로의 수를 카운트하는; 따라서 고정 소수점은 홀수 단계로 i에서 j로 갈 수 있으면 0이 아닌 (i, j) 항목을 갖게됩니다.

특히, 고정 점의 대각선은 정점이 홀수의 단계로 홀수 사이클에 도달 할 수있는 경우에만 0이 아닌 항목을 갖습니다. 따라서 그래프가 이분 된 경우에만 고정 점의 추적은 0입니다.

이 형식의 또 다른 25 바이트 솔루션은 Tr[#O@n//.x_:>#.#.x]===0&바이트 수를 훨씬 더 낮추는 방법에 대한 아이디어를 제공하는 경우입니다.

이전 노력

나는이 답변에 정착하기 전에이 답변에 대한 여러 가지 접근법을 시도했습니다.

26 바이트 : 행렬 지수

N@Tr[#.MatrixExp[#.#]]==0&

또한 인접 행렬의 홀수 제곱에 의존합니다. X * EXP 때문에 (X 2 ) X + x는 3 + X 5 / 2! + x 7/4 ! + ..., x가 행렬 A 인 경우 이것은 A의 모든 홀수 거듭 제곱에 대해 양의 항을 가지므로 A가 홀수 사이클을 갖는 경우에도 0 트레이스를 갖습니다. 이 솔루션은 큰 행렬의 경우 매우 느립니다.

29 바이트 : 큰 홀수

Tr[#.##&@@#~Table~Tr[2#!]]<1&

n x n 행렬 A의 경우 A 2n + 1 을 찾은 다음 대각선 검사를 수행합니다. 여기 #~Table~Tr[2#!]에서 n x n 입력 행렬의 2n 복사본을 생성 하고 그 결과로 행렬의 2n + 1 복사본을 곱하여 #.##& @@ {a,b,c,d}압축을 풉니 다 a.a.b.c.d.

53 바이트 : 라플라시안 행렬

(e=Eigenvalues)[(d=DiagonalMatrix[Tr/@#])+#]==e[d-#]&

스펙트럼 그래프 이론에서 모호한 결과를 사용합니다 ( 이 pdf의 법안 1.3.10 ).


보다 효율적인 방법으로 몇 바이트를 면도 할 수 있다고 생각합니다 Tr[#.Nest[#.#&,#,Tr[#!]]]<1&. (이것은 내가 볼 때마다 계속 좋아지는 놀라운 답변입니다!)
나무가 아닙니다.

1
이것은 세미 빌트인보다 적은 바이트를 가지고 있습니다 (2 개의 기능이 필요합니다)BipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder

2
@KellyLowder : 큰 행렬 MatrixExp의 경우 평가되지 않은 Root객체 로 결과를 반환하며 추가시 자동으로 단순화되지 않습니다. N@이러한 힘 Root(S)는 수치 그래서 truthiness 후 평가 될 수 있다는 계산한다.
Michael Seifert

1
@Notatree 당신의 접근 방식은 실제로 몇 바이트를 줄이지 만 비용이 많이 든다. 18x18 행렬의 경우 1000 배 느리고 거기에서 더 나빠집니다. 변경을하면 효율적인 방법을 "효율적"이라고 부를 권리가 없다고 생각합니다.
Misha Lavrov

1
@KellyLowder을 (를 BipartiteGraphQ@*AdjacencyGraph) 단축 할 수는 있지만 여전히 더 깁니다.
Martin Ender

3

자바 스크립트, 78 바이트

m=>!m.some((l,i)=>m.some((_,s)=>(l=m.map(t=>t.some((c,o)=>c&&l[o])))[i]&&s%2))

0 / 1의 배열의 배열을 입력하고 true / false를 출력합니다.


2

Pyth , 25 바이트

xmyss.D.DRx0dQx1d.nM*FQss

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

이것은 -1거짓을 나타내며, 음이 아닌 정수는 진실을 나타냅니다.

작동 원리

xmyss.D.DRx0dQx1d.nM * FQss ~ 전체 프로그램, STDIN으로부터 인접 행렬을 수신합니다.

                    * FQ ~ 직교 곱에 의한 축소 (배).
                 .nM ~ 각각 평평하게하십시오.
 m ~ 변수가있는 맵 d.
         RQ ~ 입력의 각 요소에 대해
       .D ~ 색인에서 요소 삭제 ...
          x0d ~ d에서 0의 모든 인덱스
     .D ~이 목록에서 색인의 요소를 삭제하십시오.
              x1d ~ d에서 1의 모든 인덱스
    s ~ Flatten.
   s ~ 합계 []가 나타나지 않으면 s를 사용할 수있었습니다.
  y ~ 더블
x ~ 위의 매핑에서 첫 번째 인덱스를 가져옵니다 ...
                       ss ~ 입력 행렬의 총 1 수.

이것은 현재 Pyth 버전 TiO가 있는 커밋 d315e19 에서 작동합니다 .

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