グラフが d colorable かどうかを判断するプログラムを作成する必要があります。基本的には、彩色インデックスが d または d+1 であるかどうかを確認する必要があります。ここで、d はすべての頂点の最大次数です (vizing の定理)。この問題はNP完全であり、基本的にブルートフォースでなければならないことを私は知っています。アイデアはあったが、それが正しいかどうかわからない -
1) deg(v) = d で頂点を見つけ、v に付随するすべてのエッジを d の異なる色で色付けします。
2) v に隣接する頂点に付随するすべてのエッジに対して、d 色のセットからいくつかの色を適用します。
3) 「発見された」エッジに対して 2) を繰り返す
すべてのエッジが d 色で着色されている場合、彩度インデックスは d であり、グラフ G の 1 つの着色があります。
いくつかのエッジを d 色のセットの色で着色できない場合は、d+1 番目の色で色を付け、残りのエッジを d+1 色のセットの色で色付けします - ここに問題があります - このスキームを使用して、クロマティック インデックスが d+1 であると宣言した場合、他の着色でクロマティック インデックスが d になる可能性はありますか? (色付けされるエッジごとに、使用できる色を 1 つ選択しています)..
また、この問題に最適なグラフ表現はどれですか? 入力ファイルでは、グラフは隣接行列で記述されます。再帰で解決できることは知っていますが、方法がわかりません。私はいくつかの複雑すぎるアイデアで立ち往生しています:S (いくつかのヒントまたは擬似コードをいただければ幸いです)。
編集:
思いついたのですが、大丈夫だと思います(純粋なブルートフォース)。私はまだこれを実装しようとしませんでした。何か間違っているところがあればコメントしてください。もう一度言います - アルゴリズムは、グラフが d または d+1 色で色付け可能かどうかをチェックする必要があります。d は、与えられた単純なグラフのすべての頂点の最大次数です。
colorEdge(edge, color, extra) {
if (edge colored) return; //if already colored, return
if (can be colored in color) color it; //if color can be applied, apply it
else {
//else, 'd+1'-st color neded, so color it with that color, continue finding
//coloring with d+1 colors
extra = true;
color it in color extra;
}
//recursivly try to color adjacent edges with available colors
for each color c' from set of d colors {
for each edge k adjacent to current {
colorE(k, c', extra)
}
}
}
//main
bool extra = false;
for each color b from set of d colors {
colorEdge(some starting edge, b, extra)
if (!extra) break;
}