Гах, я должен спать! Но я не могу сосчитать, сколько раз я откладывал присвоение до самого последнего возможного момента, поэтому я чувствую сочувствие по поводу вашего крайнего срока.
Это на самом деле не "грубый" подход, поскольку на самом деле все сводится к тому, чтобы попробовать каждую возможную комбинацию раскраски узлов и проверить, какие из них не конфликтуют. Ваш подход - эвристика, известная как жадная раскраска . Он может найти оптимальные результаты, но также может дать произвольно плохое решение. Тем не менее, я попытался вручную просмотреть образец ввода, который вы предоставили (спасибо, Microsoft Paint) и следуя этому алгоритму, результат должен быть действительно 4, начиная с вершины 0.
Итак, вот что я считаю неправильным в вашем коде. В следующем отрывке ...
if(input[v][j] == 1)
{
if(q[v] == j+1)
match = true;
}
Похоже, вы сравниваете цвет текущей вершины (который в любом случае будет i
) с индексом вершины, а не с цветом этой другой вершины. Я думаю, вам нужно изменить внутренний тест на ...
if(i == q[j])
или, если хотите (ничего не изменится) ...
if(q[i] == q[j])
Кроме того, вы делаете слишком много проверок. Вершины 0 может быть назначен цвет 1. Затем необходимо проверить вершину 1 по отношению к вершине 0, если она смежна. Вершина 2 должна быть проверена на 0 и 1, если они смежные, и так далее. Вы проверяете вершины, которым еще не был присвоен цвет. Так что не ограничивайте j
n
, но ограничивайте его текущей вершиной v
.
Наконец, использование такой конструкции, как if(match == false)
, довольно запутанно и необязательно. Просто используйте if(!match)
.
Надеюсь, это поможет. Если вы все еще застряли, и я вовремя ловлю комментарии, я могу предоставить больше указателей.