Я должен создать программу, которая скажет, является ли граф d раскрашиваемым или нет - в основном я должен проверить, равен ли хроматический индекс d или d + 1, где d - максимальная степень всех вершин (теорема Визинга).Я знаю, что эта проблема является NP-полной, и в основном она должна быть грубой.У меня была идея, но я не знаю, верна ли она -
1) найти вершину с deg (v) = d и закрасить все ребра, попадающие в v, с помощью d distnict цветов.
2) для всех ребер, инцидентных вершинам, смежным с v, примените цвет из набора d цветов
3) повторите 2) для "обнаруженных" ребер
Если все ребра окрашены с помощью dцвета, хроматический индекс - d, и у меня есть одна раскраска графа G.
Если какой-либо край не может быть окрашен цветом из набора из d цветов, раскрасьте его цветом d + 1-й и оставшиеся края цветас цветами из набора цветов d + 1 - вот вопрос - используя эту схему, если я объявляю, что хроматический индекс равен d + 1, есть ли вероятность, что с какой-либо другой раскраской хроматический индекс будет d?(для каждого ребра, который будет окрашен, я выбираю один цвет, который можно использовать) ..
Кроме того, какое графическое представление будет лучшим для этой проблемы?Во входном файле граф записывается в матрице смежности.я знаю, что это можно решить с помощью рекурсии, но я понятия не имею, как.Я застрял с некоторыми слишком сложными идеями: 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;
}