Là những cây đẳng cấu?


21

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 Lcá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 > 0có 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:

  1. Họ không trống rỗng.
  2. Chúng có cùng chiều dài.
  3. Mỗi danh sách Lthỏa mãn L[i] < icho 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]


@DigitalTrauma Dangit, bạn đã tạo OP không cho phép tích hợp sẵn ... Tôi đã có giải pháp Mma 60 byte ...
LegionMammal978

Câu trả lời:


2

Toán học, 48 byte

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

Nó thậm chí còn ngắn hơn giải pháp sử dụng IsomorphicGraphQ:

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Con trăn, 83

Hàm ẩn danh trên dòng thứ 2 là giải pháp của tôi.

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

ftrả về một hình thức được phong thánh của một cây con, đó là một danh sách được sắp xếp của những đứa trẻ được phong thánh của nó. Sau đó, chúng ta chỉ cần kiểm tra xem các hình thức được chuẩn hóa của mỗi cây có bằng nhau không.

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.