这是对矩阵色数的强力尝试。它似乎在某种意义上起作用,它给我正确的颜色数量,但不是1,2,3,4,它将显示1,2,3,6。出于某种原因,即使矩阵可能成功用较少的颜色,它仍然会失败并继续达到最大数量。有没有理由继续失败?
“n”是最大颜色数。 “v”是顶点,“m”是当前使用的颜色数。
伪代码: http://i42.tinypic.com/deoc2u.jpg
static int color(){
int i;
for(i = 1; i <= n; i++)
{
if(color(0,i)){
return i;}
}
return i;
}
static boolean color(int v, int m) {
if(v > n-1)
return true;
else
{
for(int i = 1; i <= m; i++)
{
boolean match = false;
q[v] = i;
for(int j = 0; j < n; j++)
{
if(input[v][j] == 1)
{
if(q[v] == j+1)
match = true;
}
}
if(match == false)
{
if(color(v+1,m))
return true;
}
}
q[v] = 0;
return false;
}
}
示例输出:
文件名:file1
输入
6
0 1 1 0 1 1
1 0 1 1 1 1
1 1 0 1 0 1
0 1 1 0 1 1
1 1 0 1 0 1
1 1 1 1 1 0
1失败了
2失败了
3失败了
4失败了
5失败了
颜色: 1 2 3 1 3 6
答案 0 :(得分:0)
这实际上并不是一种“暴力”方法,因为实际上这将是尝试每个可能的节点着色组合并检查哪些不冲突。您的方法是一种称为greedy coloring的启发式方法。它可以找到最佳结果,但也可能产生任意不好的解决方案。也就是说,我已经尝试手动浏览您提供的示例输入(谢谢,Microsoft Paint),并且遵循该算法,从顶点0开始时结果应该确实为4。
所以这就是我认为您的代码可能出错的地方。在以下摘录中......
if(input[v][j] == 1)
{
if(q[v] == j+1)
match = true;
}
您似乎将当前顶点(无论如何只是i
)的颜色与顶点索引进行比较,而不是将其他顶点的颜色进行比较。我认为你需要改变内部测试......
if(i == q[j])
或者,如果你愿意(不会有所作为)......
if(q[i] == q[j])
另外,你做的检查太多了。可以为顶点0指定颜色1.如果顶点0相邻,则需要对顶点0进行检查。如果它们相邻,则需要针对0和1检查顶点2,依此类推。您正在检查尚未分配颜色的顶点。因此,请不要将j
限制为n
,而是将其限制为当前的顶点v
。
最后,使用像if(match == false)
这样的结构是相当混乱而不是必需的。只需使用if(!match)
代替。
希望这会有所帮助。如果你仍然卡住了,我碰巧及时发现了评论,我可以提供更多指示。