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:
Để đến nút D
từ A
, bạn có thể lấy đường dẫn A->B->D
hoặc A->C->D
. Như vậy, D
có thể truy cập từ A
. Tuy nhiên, không có đường dẫn nào có thể đi đến nút B
bắt đầu từ nút C
. Do đó, nút B
khô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:
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.