Đồ thị của tôi có duyên dáng không?


8

Một Graph Graceful là một loại đồ thị đơn giản . Các biểu đồ duyên dáng rất đặc biệt vì có một cách để gắn nhãn tất cả các nút của chúng bằng các số nguyên dương để khi các cạnh cũng được gắn nhãn với sự khác biệt của các nút mà chúng kết nối, không có hai cạnh nào có cùng nhãn và mỗi nhãn cho đến số cạnh Được sử dụng.

Ví dụ làm việc

Đây là một biểu đồ đơn giản mà chúng tôi nghi ngờ là một biểu đồ duyên dáng

Đồ thị đơn giản

Hãy để chúng tôi thử ghi nhãn sau:

Dán nhãn

Lưu ý chúng tôi được phép bỏ qua các số nguyên trong ghi nhãn nút của chúng tôi. Bây giờ chúng tôi dán nhãn cho mọi cạnh với sự khác biệt tích cực giữa các nút mà nó kết nối. Để tăng khả năng hiển thị, tôi đã dán nhãn này bằng màu đỏ.

Nhãn đôi

Mỗi cạnh có một số duy nhất và không có số nào nằm trong khoảng từ 1 đến 7 (số cạnh chúng ta có) bị bỏ lại. Do đó đồ thị của chúng tôi là duyên dáng.

Bài tập

Đưa ra một biểu đồ, thông qua bất kỳ phương pháp nhập liệu hợp lý nào, sẽ đưa ra một giá trị trung thực nếu nó là duyên dáng và một giá trị giả mạo khác.

Đây là vì vậy mục tiêu là giảm thiểu số byte của bạn.

Các trường hợp thử nghiệm

Ở đây đồ thị được biểu diễn dưới dạng một mảng các cạnh:

3 nodes:

[(0,1),(0,2),(1,2)]

True

Labeling:

Node 0 -> 0
Node 1 -> 2
Node 2 -> 3

5 nodes:

[(0,1),(0,4),(1,2),(2,3),(3,4)]

False

5 nodes:

[(0,1),(1,2),(2,3),(3,4)]

True

Labeling:

Node 0 -> 0
Node 1 -> 1
Node 2 -> 3
Node 3 -> 6
Node 4 -> 10

9 nodes

[(0,1),(1,2),(1,7),(1,8),(2,3),(2,6),(3,4),(4,5)]

True

Labeling:

Node 0 -> 0
Node 1 -> 1
Node 2 -> 3
Node 3 -> 6
Node 4 -> 10
Node 5 -> 15
Node 6 -> 11
Node 7 -> 7
Node 8 -> 8

5 nodes

[(0,1),(0,2),(1,2),(1,3),(1,4),(3,4)]

False

Tôi nghĩ rằng các thuật toán để kiểm tra sự duyên dáng chỉ được biết đến với một số loại biểu đồ nhất định (ví dụ như cây )
ngenisis

2
@ngenisis Nó chắc chắn có thể bị ép buộc. Có các thuật toán hiệu quả hơn cho các lớp nhất định nhưng bạn có thể sử dụng các hạn chế về kích thước cạnh để tạo sự khác biệt nhãn nút tối đa.
Ad Hoc Garf Hunter

[(0,1),(1,2),(2,3),(3,4)]có lẽ là một trường hợp cạnh đáng chú ý.
Dennis

Trừ khi tôi thiếu một cái gì đó, các biểu đồ có dạng {(k-1,k) : 0 < k < n}yêu cầu nhãn cao nhất trong tất cả các biểu đồ có cùng số nút.
Dennis

@Dennis Ồ vâng. Đó là điều chắc chắn đúng họ nên yêu cầu n(n+1)/2như nhãn hiệu cao nhất của họ. Tôi đã thêm trường hợp thử nghiệm của bạn.
Ad Hoc Garf Hunter

Câu trả lời:


6

Thạch , 12 byte

FSŒ!ị@€ḅ-AċJ

Có một mảng các cạnh như các cặp nút được lập chỉ mục 1.

Hãy thử trực tuyến! (Rất kém hiệu quả. Đừng bận tâm với các trường hợp thử nghiệm thực tế.)

Làm thế nào nó hoạt động

FSŒ!ị@€ḅ-AċJ  Main link. Argument: A (array of pairs)

FS            Flatten and sum, yielding s. This is an upper bound for the labels
              a graceful labeling (if one exists) would require.
  Œ!          Take all permutations of [1, ..., s].
      €       For each permutation P:
    ị@          Replace each integer in A with the element of P at that index.
       ḅ-     Convert all pairs from base -1 to integer, mapping (a,b) to b-a.
         A    Take absolute values.
           J  Yield the indices of A, i.e., [1, ..., len(A)].
          ċ   Count the occurrences of [1, ..., len(A)] in the result to the left.

2
ḅ-là một trong những thủ thuật Jelly yêu thích của tôi :-)
ETHproductions 17/2/2017

4

Toán học, 121 116 byte

Chỉnh sửa: Đã lưu 5 byte nhờ JungHwan Min và Martin Ender

Cases[Range[1+Tr[n=Range@Length[e=EdgeList@#]]]~Tuples~VertexCount@#,w_/;Sort[Abs[#-#2]&@@w[[List@@#]]&/@e]==n]!={}&

Giải trình

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

Hàm thuần túy lấy một Graphđối tượng Mathicala có các đỉnh {1, 2, ..., k}cho một số nguyên không âm k. Trong trường hợp xấu nhất, chúng tôi sẽ chỉ cần đỉnh nhãn khác nhau, từ 1đến 1 + (1 + 2 + ... EdgeCount@#). Vì nó tiết kiệm cho chúng tôi một số byte sau này, chúng tôi sẽ cho phép edanh sách các cạnh và nlà danh sách {1, 2, ..., EdgeCount@#}, do đó, trọng số đỉnh sẽ được rút ra từ đó Range[1+Tr[n=Range@Length[e=EdgeList@#]]]. Chúng tôi tạo ra một danh sách tất cả Tuplescác độ dài VertexCount@#, sau đó chúng tôi chọn Casescái cho nhãn hiệu duyên dáng và kiểm tra xem kết quả có nằm Unequaltrong danh sách trống không {}. Sự duyên dáng của danh sách các trọng số đỉnh wđược kiểm tra bằng cách Mapping chức năng Abs[#-#2]&@@w[[List@@#]]&qua danh sách các cạnh e, Sortlấy kết quả và kiểm tra xem kết quả có phải làEqualđể n. Đây là một sự cố của chức năng đó:

               List@@#     Replace the Head of the edge with List; i.e., UndirectedEdge[a,b] becomes {a,b}.
            w[[       ]]&  Select the corresponding vertex weights from the list w.
          @@               Replace the Head of that expression (List) with the function
Abs[#-#2]&                   which returns the absolute difference between its first two arguments.
                           This effectively passes the vertex weights into the absolute difference function. 

1
lưu một byte bằng cách gây rối với một số ưu tiên: VertexCount[#]->VertexCount@#
JungHwan Min

1
Btw, Trthủ thuật Lengthkhông còn lưu byte nếu bạn cần thêm dấu ngoặc đơn. Length[e=EdgeList@#]là cùng chiều dài. Nhưng nó ngắn hơn để tránh điều đó hoàn toàn và viết lại số tam giác ở đó như Tr@Range@EdgeCount@#(và sau đó thay thế ebằng EdgeList@#. Thứ hai, toán tử hàm hiếm khi lưu byte, trong trường hợp này tôi nghĩ rằng nó ngắn hơn để sử dụng Casesthay vì Selectvà sau đó w_/;thay vì w.
Martin Ender
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.