Là DAG giảm transitive?


11

Mục tiêu của thử thách này được đưa ra một đồ thị chu kỳ có hướng hữu hạn (DAG), xác định xem đồ thị có phải là giảm chuyển tiếp hay không .

Một lời giải thích ngắn gọn về DAG và giảm bắc cầu là gì:

DAG là một biểu đồ có các cạnh được định hướng (nghĩa là bạn chỉ có thể di chuyển theo một hướng trên cạnh đó) sao cho có bất kỳ nút bắt đầu nào trên biểu đồ, không thể quay lại nút bắt đầu (tức là không có chu kỳ).

Với bất kỳ nút bắt đầu nào, nếu có thể di chuyển đến một nút kết thúc khác trong biểu đồ thông qua bất kỳ số cạnh dương tùy ý nào, thì nút kết thúc đó được xác định là có thể truy cập từ nút bắt đầu. Trong một DAG chung, có thể có nhiều đường dẫn có thể được lấy từ nút bắt đầu đến nút kết thúc đích. Ví dụ: lấy biểu đồ kim cương này:

nhập mô tả hình ảnh ở đây

Để đến nút Dtừ A, bạn có thể lấy đường dẫn A->B->Dhoặc A->C->D. Như vậy, Dcó thể truy cập từ A. Tuy nhiên, không có đường dẫn nào có thể đi đến nút Bbắt đầu từ nút C. Do đó, nút Bkhông thể truy cập từ nút C.

Xác định khả năng tiếp cận của biểu đồ dưới dạng danh sách các nút có thể tiếp cận cho mọi nút bắt đầu trong biểu đồ. Vì vậy, đối với cùng một biểu đồ kim cương, khả năng tiếp cận là:

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

Một biểu đồ khác có khả năng tiếp cận tương tự như biểu đồ trên được hiển thị bên dưới:

nhập mô tả hình ảnh ở đây

Tuy nhiên, biểu đồ thứ hai này có nhiều cạnh hơn biểu đồ ban đầu. Sự giảm bắc cầu của đồ thị là một đồ thị có số cạnh ít nhất và cùng khả năng tiếp cận của đồ thị ban đầu. Vì vậy, biểu đồ đầu tiên là sự giảm bắc cầu của cái thứ hai.

Đối với một DAG hữu hạn, việc giảm bắc cầu được đảm bảo tồn tại và là duy nhất.

Đầu vào

Đầu vào là một "danh sách các danh sách", trong đó danh sách bên ngoài có độ dài của số đỉnh và mỗi danh sách bên trong là độ dài của số cạnh rời khỏi nút liên kết và chứa chỉ số của các nút đích. Ví dụ: một cách để mô tả biểu đồ đầu tiên ở trên sẽ là (giả sử lập chỉ mục dựa trên số 0):

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

Bạn có thể bắt đầu lập chỉ mục của nút đầu tiên tại bất kỳ giá trị số nguyên tùy ý (ví dụ: lập chỉ mục dựa trên 0 hoặc 1).

Đầu vào có thể đến từ bất kỳ nguồn đầu vào nào bạn muốn (stdio, tham số hàm, v.v.). Bạn có thể tự do chọn định dạng đầu vào chính xác miễn là không có thêm thông tin nào. Ví dụ: nếu bạn muốn lấy đầu vào từ stdio, bạn có thể có mỗi dòng là một danh sách các cạnh cho nút liên kết. Ví dụ.:

1 2
3
3
'' (blank line)

Các chỉ số trong mỗi danh sách kề không nhất thiết phải được sắp xếp và có thể có nhiều cạnh kết nối hai nút (ví dụ [[1,1],[]]:). Bạn có thể giả sử đồ thị đầu vào được kết nối yếu và không chứa chu kỳ (nghĩa là DAG).

Đầu ra

Đầu ra là trung thực nếu DAG đầu vào đã cho là mức giảm bắc cầu và giá trị giả là khác. Điều này có thể là với bất kỳ mức độ mong muốn nào (stdio, giá trị trả về, tham số đầu ra, v.v.)

Ví dụ

Tất cả các ví dụ sử dụng lập chỉ mục dựa trên 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

Chấm điểm

Đây là mã golf; mã nhỏ nhất tính bằng byte thắng. Mã của bạn phải hoàn thành trong một khoảng thời gian hợp lý (tối đa 10 phút cho bất kỳ phần cứng nào bạn có). Tiêu chuẩn áp dụng. Bạn có thể sử dụng bất kỳ tích hợp nào mong muốn.


Chúng ta có thể đưa ra bất kỳ giả định nào về khả năng kết nối của đầu vào không? (Tôi chưa kiểm tra tất cả các trường hợp thử nghiệm của bạn, nhưng chúng có bao gồm nhiều phần bị ngắt kết nối của biểu đồ không?)
Martin Ender

cập nhật với những gì tôi tin là ngôn ngữ chính xác.
hellowworld922

Tôi đoán điều đó tốt. Bạn cũng có thể nói rằng biểu đồ được kết nối yếu .
Martin Ender

Câu trả lời:


5

Ruby, 101 97 byte

Cách tiếp cận đơn giản tính toán phạm vi tiếp cận từ mỗi nút và xem xét nếu một nút con có thể đạt được thông qua bất kỳ nút nào khác. Dường như thất bại trên các biểu đồ tuần hoàn, nhưng định nghĩa của DAG ngụ ý rằng nó không nên theo chu kỳ.

Hãy thử trực tuyến!

->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

Toán học, 95 82 byte

13 byte được lưu do @MartinEnder .

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

Chức năng ẩn danh. Lấy danh sách lồng nhau làm đầu vào (dựa trên 1) và trả về Truehoặc Falselàm đầu ra. Giải pháp chính ở đây là 46 byte #~IsomorphicGraphQ~TransitiveReductionGraph@#&, kiểm tra xem một đồ thị đã cho có đẳng cấu với mức giảm chuyển tiếp của nó hay không. Phần còn lại chuyển đổi đầu vào thành một Graphđối tượng.


3

CJam (41 byte)

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

Bản demo trực tuyến , khai thác thử nghiệm

Mổ xẻ

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

Thạch, 20 byte

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

Sử dụng lập chỉ mục dựa trên 1. Hãy thử trực tuyến!

Tổng quan lỏng lẻo

     €                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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.