Giới thiệu
Trong thử thách này, nhiệm vụ của bạn là viết một chương trình quyết định xem hai cây đã cho có phải là đẳng cấu hay không. Cây có nghĩa là một biểu đồ chu kỳ có hướng trong đó mỗi nút có chính xác một cạnh đi, ngoại trừ gốc không có. Hai cây là đẳng cấu nếu một cây có thể biến đổi thành cây kia bằng cách đổi tên các nút. Ví dụ: hai cây (nơi mọi cạnh đều hướng lên)
0 0
/|\ /|\
1 3 4 1 2 5
|\ /|
2 5 3 4
dễ dàng được nhìn thấy là đẳng cấu.
Chúng tôi mã hóa một cây dưới dạng một danh sách L
các số nguyên không âm theo cách sau. Rễ cây có nhãn 0
, và nó cũng có các nút 1,2,...,length(L)
. Mỗi nút i > 0
có một cạnh đi đến L[i]
(sử dụng lập chỉ mục dựa trên 1). Ví dụ: danh sách (với các chỉ số được đưa ra theo các yếu tố)
[0,0,1,3,2,2,5,0]
1 2 3 4 5 6 7 8
mã hóa cây
0
/|\
1 2 8
| |\
3 5 6
| |
4 7
Đầu vào
Đầu vào của bạn là hai danh sách các số nguyên không âm, được đưa ra ở định dạng gốc hoặc ngôn ngữ của bạn. Họ mã hóa hai cây theo cách được chỉ định ở trên. Bạn có thể giả sử các điều kiện sau về chúng:
- Họ không trống rỗng.
- Chúng có cùng chiều dài.
- Mỗi danh sách
L
thỏa mãnL[i] < i
cho tất cả các chỉ số (dựa trên 1)i
.
Đầu ra
Đầu ra của bạn sẽ là một giá trị trung thực nếu các cây là đẳng cấu, và giá trị giả nếu không.
Quy tắc và tính điểm
Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Không có giới hạn về thời gian, nhưng các phần tử tích hợp quyết định sự đồng hình của cây hoặc đồ thị không được phép.
Các trường hợp thử nghiệm
Trường hợp thật
[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]
Trường hợp giả
[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]