私のグラフは優雅ですか?


8

A 優雅なグラフの種類であるシンプルなグラフ。優雅なグラフは特別です。すべてのノードに正の整数でラベルを付ける方法があるため、エッジが接続するノードの違いでエッジにもラベルが付けられる場合、2つのエッジが同じラベルを持たず、すべてのラベルはエッジの数まであります。使用されている。

ワークアウトの例

これは、グレースフルグラフと思われる単純なグラフです。

単純なグラフ

次のラベルを試してみましょう。

ラベル付き

ノードのラベル付けで整数をスキップすることが許可されていることに注意してください。次に、すべてのエッジに、接続するノード間の正の差でラベルを付けます。見やすくするために、これらを赤でラベル付けしました。

二重ラベル

各エッジには一意の番号があり、1〜7(エッジの数)の数字は省略されません。したがって、私たちのグラフは優雅です。

仕事

適切な入力方法でグラフが与えられた場合、それが適切な場合は真の値を出力し、それ以外の場合は偽の値を出力します。

これはので、目的はバイト数を最小限に抑えることです。

テストケース

ここでは、グラフはエッジの配列として表されます。

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

優雅さをチェックするアルゴリズムは、特定のクラスのグラフ(たとえば、)でのみ知られていると思います
ngenisis

2
@ngenisisそれは確かに総当たりです。特定のクラスにはより効率的なアルゴリズムがありますが、エッジサイズの制限を使用して、最大のノードラベルの差を作成できます。
アドホックガーフハンター

[(0,1),(1,2),(2,3),(3,4)]おそらく注目すべきエッジケースです。
デニス

私が何かを欠落していない限り、フォームの{(k-1,k) : 0 < k < n}グラフには、同じ数のノードを持つすべてのグラフの最も高いラベルが必要です。
デニス

@デニスああそう。それは確かに彼らがn(n+1)/2彼らの最高のラベルとして要求するべきである真実です。テストケースを追加しました。
アドホックガーフハンター

回答:


6

ゼリー、12バイト

FSŒ!ị@€ḅ-AċJ

エッジの配列を1インデックス付きノードのペアとして取得します。

オンラインでお試しください!(恐ろしく非効率的です。実際のテストケースを気にしないでください。)

使い方

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
ḅ-は私のお気に入りのジェリートリックの1つです:-)
ETHproductions

4

Mathematicaの、121の 116バイト

編集:ジョンファンミンとマーティンエンダーのおかげで5バイト節約

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

説明

ここに画像の説明を入力してください

いくつかの非負の整数のGraph頂点を持つMathematica オブジェクトを取る純粋な関数。最悪の場合、〜の範囲の頂点ラベルのみが必要になります。後で数バイトを節約できるので、エッジのリストにしてリストにし、頂点の重みをから取得します。すべての長さのリストを生成し、適切なラベルを与えるものを選択し、結果が空のリストであることを確認します。頂点の重みのリストの優雅は、によって確認さピング機能をエッジのリストの上に、結果をINGの、そして結果があるかどうかをチェックします{1, 2, ..., k}k11 + (1 + 2 + ... EdgeCount@#)en{1, 2, ..., EdgeCount@#}Range[1+Tr[n=Range@Length[e=EdgeList@#]]]TuplesVertexCount@#CasesUnequal{}wMapAbs[#-#2]&@@w[[List@@#]]&eSortEqualn。その機能の内訳は次のとおりです。

               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
いくつかの優先順位をいじってバイトを保存します:VertexCount[#]->VertexCount@#
JungHwan Min

1
ところで、括弧を追加する必要がある場合、このTrトリックはLengthバイトを節約しなくなりました。Length[e=EdgeList@#]同じ長さです。しかし、それは完全にそれを回避してそこに三角形の数を書き換えるために短いですTr@Range@EdgeCount@#(そして置き換えるeと終わりEdgeList@#。第二に、関数演算子はほとんどこのケースでは、私はそれを使用するために短いだと思う、バイトを保存しないCases代わりにSelect、その後w_/;の代わりにw
マーティンエンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.