グラフ5-彩色


14

正直なところ、これはまだ質問されていないとは信じられませんが、ここでは

バックグラウンド

単純な無向平面(グラフは交差なしで平面に描くことができます)グラフを考えると、グラフが4色であることが証明された定理です。ただし、グラフを5色にする方がはるかに簡単です。これが、今日の課題に焦点を当てるものです。

グラフの有効なk色は、次のプロパティを持つグラフのノードへの「色」の割り当てです。

  1. 2つのノードがエッジで接続されている場合、ノードは異なる色で色付けされます。
  2. グラフ全体で、最大5色があります。

これを踏まえて、単純な無向平面グラフを5色にするための非常に基本的なアルゴリズムを紹介します。このアルゴリズムには次の定義が必要です

到達可能性:ノード1がノード2から到達可能である場合、最初のノードがノード2で最後がノード1であるように、それぞれがエッジで接続された一連のノードがあることを意味しますノード1がノード2から到達可能である場合、ノード2はノード1から到達可能です。

サブグラフ:ノードNの特定のセットのグラフのサブグラフは、サブグラフのノードがすべてNであり、両方のノードがエッジで接続されている場合にのみ、元のグラフのエッジがサブグラフにあるグラフです。北にあります

Color(N)を、N個のノードを持つ平面グラフを5色で色付けする関数とします。以下の関数を定義します

  1. 接続されているノードの数が最も少ないノードを見つけます。このノードには、最大で5つのノードが接続されます。
  2. グラフからこのノードを削除します。
  3. この新しいグラフでColor(N-1)を呼び出して、色を付けます。
  4. 削除したノードをグラフに追加し直します。
  5. 可能であれば、追加されたノードに、接続されているノードのいずれにもない色を割り当てます。
  6. 可能でない場合、追加されたノードに隣接する5つのノードすべてに5つの異なる色があるため、次のプロセスを試す必要があります。
  7. 追加されたノードn1 ... n5を囲むノードに番号を付けます
  8. n1またはn3のいずれかと同じ色の元のグラフのすべてのノードのサブグラフを検討します。
  9. このサブグラフで、n1から到達可能なノードのセット(n1を含む)で、n1からn3に到達できない場合、n1のすべての色をn3に置き換えます。追加したノードn1の元の色に色を付けます。
  10. この新しいグラフでn1からn3に到達できる場合、n1とn3ではなく、ノードn2とn4でステップ9からのプロセスを実行します。

チャレンジ

edgelist(グラフを表す)の入力を指定して、各ノードに値を割り当てることにより、グラフに色を付けます。

入力:グラフ内のエッジのリスト(つまり、[('a','b'),('b','c')...]

入力エッジリストは、(a、b)がリスト内にある場合、(b、a)はリスト内にないことに注意してください。

出力:値のペアを含むオブジェクト。各ペアの最初の要素はノードで、2番目はその色、つまり、[('a',1),('b',2)...]または{'a':1,'b':2,...}

色、数字、文字、その他のものを表すために何でも使用できます。

入力と出力が非常に明確である限り、入力と出力は非常に柔軟です。

ルール

  • これは挑戦です
  • 上記のアルゴリズムを使用する必要はありません。これは単に参照用です。
  • どのグラフでも、多くの場合、有効な色付けの方法があります。アルゴリズムが生成した色付けが有効である限り、それは受け入れられます。
  • グラフは5色でなければならないことに注意してください。

テストケース

次のコードを使用して、カラーリング結果の有効性をテストします。グラフごとに有効なグラフの色が多数あるため、このアルゴリズムは単に色の有効性をチェックします。コードの使用方法については、docstringをご覧ください。

いくつかのランダムな(そしてかなり馬鹿げた)テストケース

テストケース2:Krackhardt Kite Graph [(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]

有効な出力: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

:これらのテストケースは小さすぎて、カラーアルゴリズムのより微妙な動作をテストできないため、独自のグラフを作成することは、おそらく作業の妥当性の良いテストです。

注2:すぐにカラーリングソリューションをグラフ化する別のコードを追加します。

注3:提示されたランダムなカラーリングアルゴリズムは予測していませんでした。PPCGのすばらしいところです!ただし、より決定的なアルゴリズムを使用できる人がいれば、それも非常にクールです。


3
PetersenとChvatalのグラフは非平面ではありませんか?
クロッペブ

1
@NicHartley効果的にグラフを色付けする隣接行列には、転置ベースの操作がよく知られています。見つかったら紙を添付します。
ドンサウザンド

1
解を多項式時間に制限するか、ソリューションがあなたが考えているようなグラフアルゴリズムを使用するように強制するために大きなテストケースを正常に実行することを要求した方が良いと思います。
xnor

2
@xnor私はレッスンを学んだようです。それは大丈夫だ!箱から出して考えることは、罰せられるのではなく、報われるべきです。
ドンサウザンド

1
はい、わかりますが、4色の質問は、人々がこの質問に対する答えを受け取って、に変更54て再送信できないように設計する必要があります。
ピーターテイラー

回答:


6

Python 2、96バイト

i=0
g=input()
while 1:i+=1;c={k:i/4**k%4for k in sum(g,())};all(c[s]^c[t]for s,t in g)>0<exit(c)

オンラインでお試しください!

gccc

入力は平面であるため、常に4色を見つけることができます。

(したがって、これはある意味で辞書式に最も早いカラーリングを見つけ、非常に非効率的に行います。)

k4kモッド4k


すばらしい努力ですが、1つのコンポーネントが欠けていると思います。ノードが5つの異なる色で囲まれている場合はどうですか?
ドンサウザンド

これを破るテストケースを作成しようとする
ドンサウザンド

グラフ内の特定のノードが、許可されている5つの色に既に色付けされている5つの他のノードに囲まれているとします。
ドン・サウザンド・

1
私のコードは、グラフの色付けをランダムに生成し、正しいグラフの色付けを生成するまでチェックし、終了時に印刷します。あなたがそれを説明する場合、最初からやり直して、できれば5つのノードすべてに5つの利用可能な色を付けないことを望みます。
リン

2
現在、すべてのカラーリングを辞書式の順序でチェックします:)決定論的でO(5 ^ n)ですが、ほとんどの入力ではかなり遅くなります。
リン

3

JavaScript(ES7)、80 76 74バイト

@Neilのおかげで2バイト節約

Lynnと同じアプローチ。4色で解くは、から番号03

a=>{for(x=0;a.some(a=>a.map(n=>z=c[n]=x>>n*2&3)[0]==z,c={});x++);return c}

オンラインでお試しください!


4色が許可されている場合は、なぜx>>n+n&3ですか?
ニール

@Neil Ahはい、ありがとう。5色についての説明に気を取られ、入力が4で解けることが保証されていることを忘れてしまいました。
Arnauld

3

Brachylog、38バイト

cd{∧4>ℕ}ᶻ.g;?z{tT&h⊇ĊzZhpT∧Zt≠}ᵐ∧.tᵐ≜∧

オンラインでお試しください!

説明

Example input: [["a","b"],["c","b"]]

cd                                       Concatenate and remove duplicates: ["a","b","c"]
  {∧4>ℕ}ᶻ.                               The output is this list zipped zith integers that
                                           are in [0..4]: [["a",I],["b",J],["c",K]]
         .g;?z                           Zip the output with the input:
                                           [[[["a",I],["b",J],["c",K]],["a","b"]],[["a",I],["b",J],["c",K]],["c","b"]]
              {               }ᵐ∧        Map for each element
               tT                        Call T the couple of nodes denoting an edge
                 &h⊇Ċ                    Take a subset of 2 elements in the head
                     zZ                  Zip and call it Z
                      ZhpT               The nodes in Z are T up to a permutation
                          ∧Zt≠           The integers in Z are all different color
                                 .tᵐ≜∧   Label the integers (i.e. colors) in the output so that
                                           it matches the set constraints

1

Python 2、211バイト

def f(g):
 g={k:[(a,b)[a==k]for a,b in g if k in(a,b)]for k in sum(g,())};c={k:0 for k in g}
 for a,b in sorted(g.iteritems(),key=lambda a:len(a[1])):c={k:(c[k],c[k]+1)[c[a]==c[k]and k in b]for k in c}
 return c

オンラインでお試しください!

決定的!より複雑なテストケースではおそらく失敗しますが、失敗したグラフを見つけるには燃え尽きています。より多くのテストケースや批判を歓迎します!



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.