DAG는 전이 감소입니까?


11

이 과제의 목표는 유한 방향성 비순환 그래프 (DAG) 로 주어지며 그래프가 전이 감소 인지 결정합니다 .

DAG 및 전이 감소가 무엇인지에 대한 간단한 설명 :

DAG는 그래프의 시작 노드가 주어지면 시작 노드로 돌아갈 수 없습니다 (즉, 사이클이 없음).

시작 노드가 주어지면 임의의 양의 수의 가장자리를 통해 그래프의 다른 끝 노드로 이동할 수 있으면 해당 끝 노드는 시작 노드에서 도달 가능한 것으로 정의됩니다. 일반적인 DAG에는 시작 노드에서 대상 끝 노드로 가져갈 수있는 여러 경로가있을 수 있습니다. 예를 들어이 다이아몬드 그래프를 보자.

여기에 이미지 설명을 입력하십시오

노드로 이동하려면 D에서 A, 당신은 길을 갈 수 A->B->DA->C->D. 따라서에서 D도달 할 수 있습니다 A. 그러나 node에서 B시작 하여 노드로 이동할 수있는 경로는 없습니다 C. 따라서 node B에서 node에 접근 할 수 없습니다 C.

그래프 의 도달 가능성 을 그래프의 모든 시작 노드에 대한 도달 가능한 노드 목록으로 정의하십시오 . 동일한 다이아몬드 그래프 예에서 도달 가능성은 다음과 같습니다.

A: [B, C, D]
B: [D]
C: [D]
D: []

위의 그래프와 동일한 도달 가능성을 가진 다른 그래프는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

그러나이 두 번째 그래프에는 원래 그래프보다 더 많은 모서리가 있습니다. 그래프의 전 이적 감소는 가장 적은 수의 에지와 원래 그래프의 도달 가능성이 동일한 그래프입니다. 첫 번째 그래프는 두 번째 그래프의 전 이적 감소입니다.

유한 한 DAG의 경우, 전이 감소가 존재하며 보장됩니다.

입력

입력은 "목록 목록"이며, 여기서 외부 목록은 정점 수의 길이를 가지며 각 내부 목록은 연관된 노드를 떠나는 가장자리 수의 길이이며 대상 노드의 색인을 포함합니다. 예를 들어, 위의 첫 번째 그래프를 설명하는 한 가지 방법은 다음과 같습니다 (0 기반 인덱싱 가정).

[[1, 2], [3], [3], []]

임의의 정수 값 (예 : 0 또는 1 기반 인덱싱)으로 첫 번째 노드의 인덱싱을 시작할 수 있습니다.

입력은 원하는 입력 소스 (stdio, function parameter 등)에서 올 수 있습니다. 추가 정보가없는 한 정확한 입력 형식을 자유롭게 선택할 수 있습니다. 예를 들어 stdio에서 입력을 받으려면 각 라인을 연관된 노드의 모서리 목록으로 만들 수 있습니다. 전의.:

1 2
3
3
'' (blank line)

각 인접 목록의 색인이 반드시 정렬 될 필요는 없으며 두 노드를 연결하는 여러 개의 모서리가있을 수 있습니다 (예 :) [[1,1],[]]. 입력 그래프가 약하게 연결 되어 있고주기가 포함되어 있지 않다고 가정 할 수 있습니다 (예 : DAG).

산출

주어진 입력 DAG가 전 이적 감소이면 거짓이며, 그렇지 않으면 거짓 값입니다. 원하는 싱크 (스테 디오, 리턴 값, 출력 매개 변수 등) 일 수 있습니다.

모든 예제는 0 기반 인덱싱을 사용합니다.

[[1,2],[3],[3],[]]
true

[[1,2,3],[3],[3],[]]
false

[[1,1],[]]
false

[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[1,3],[2],[3],[]]
false

채점

이것은 코드 골프입니다. 바이트 단위의 가장 작은 코드가 이깁니다. 코드는 적절한 시간 내에 완료해야합니다 (하드웨어에 관계없이 최대 10 분). 표준 허점이 적용됩니다. 원하는 내장 기능을 사용할 수 있습니다.


입력의 연결성에 대해 어떤 가정을 할 수 있습니까? (모든 테스트 사례를 확인하지는 않았지만 그래프에서 연결이 끊긴 여러 부분을 다루고 있습니까?)
Martin Ender

올바른 언어라고 생각하는 것으로 업데이트되었습니다.
helloworld922

괜찮습니다. 그래프가 약하게 연결되어 있다고 말할 수도 있습니다 .
Martin Ender

답변:


5

루비, 101 97 바이트

각 노드의 도달 범위를 계산하고 다른 노드를 통해 자식 노드에 도달 할 수 있는지 고려하는 간단한 접근 방식입니다. 순환 그래프에서는 겉보기에는 실패하지만 DAG의 정의는 순환 그래프가 아니어야 함을 의미합니다.

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

->g{r=->i{i|i.map{|j|r[g[j]||[]]}.inject([],:|)}
g.all?{|e|e==e&e&&e.none?{|i|r[e-[i]].index i}}}

4

매스 매 티카, 95 82 바이트

@MartinEnder 로 인해 13 바이트가 저장되었습니다 .

#~IsomorphicGraphQ~TransitiveReductionGraph@#&@Graph[x=0;##&@@Thread[++x->#]&/@#]&

익명의 기능. 중첩 된 목록을 (1 기반) 입력으로 가져 True오거나 False출력으로 가져 옵니다 . 여기서 주요 솔루션은 46 바이트 #~IsomorphicGraphQ~TransitiveReductionGraph@#&이며, 이는 주어진 그래프가 전이 감소와 동형인지 테스트합니다. 나머지는 입력을 Graph객체 로 변환 합니다.


3

CJam (41 바이트)

q~:A_,{{Af=e__&}%_}*]:.|A.&A:$:e`e_2%1-*!

온라인 데모 , 테스트 하네스

해부

q~:A      e# Parse input and store in A
_,{       e# Loop V times
  {       e#   Extend adjacency list representation of G^i to G^(i+1)
    Af=   e#   by extending each path by one edge
    e__&  e#   and flattening. NB :| would be shorter but breaks for empty lists
  }%
  _       e#   Duplicate, so that we build up G^2, G^3, ..., G^n
}*]       e# Gather in a single array
:.|       e# Fold pointwise union, giving the reachability from each vertex by
          e# paths of length > 1
A.&       e# Pointwise intersect with the paths of length 1
          e# We hope to get an array of empty arrays

          e# Handle the awkward special case of duplicate edges:
A:$       e# Sort each adjacency list
:e`       e# Run-length encode each adjacency list
e_2%      e# Extract only the run lengths
1-        e# Discard the 1s - so we now have an empty array unless there's a dupe

*         e# Join. We hope to be joining an array of empty arrays by an empty array
          e# giving an empty array
!         e# Check that we get a falsy value (i.e. the empty array)

3

젤리, 20 바이트

ị³$ÐĿ€ị@Fœ&¥";œ-Q$€E

1 기반 인덱싱을 사용합니다. 온라인으로 사용해보십시오!

느슨한 개요

     €                for each vertex,
ị³$ÐĿ                   compute its reach.
        Fœ&¥"         intersect each vertex's lists of children and
      ị@                children's reaches.
             ;        then concatenate the list of intersections with
              œ-Q$€     all duplicate edges in the original graph.
                   E  are all elements equal? checks that all are empty lists,
                        meaning empty intersections and no duplicates.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.