C++ 图着色问题 最少颜色数算法实现
这段代码实现了图着色问题,使用贪心算法来计算图着色所需的最小颜色数。
#include <iostream>
using namespace std;
int map[] = {
0,1,1,1,1,1,1,
1,0,1,0,0,0,0,
1,1,0,1,1,0,0,
1,0,1,0,0,0,0,
1,0,1,0,0,1,0,
1,0,0,0,1,0,0,
1,0,0,0,0,0,0
};
struct Node
{
int num;
int color;
int degree;
};
Node node[7];
int colors[10] = { 1,2,3,4 };
int colorsize = 4;
void order(Node node[],int n)
{
Node a;
for (int i = 0; i < n-1; i++)
{
if (node[i].degree < node[i + 1].degree)
{
a = node[i];
node[i] = node[i + 1];
node[i + 1] = a;
}
}
}
void paint(int map[],int n)
{
for (int i = 0; i < n; i++)
{
node[i].degree = node[i].color = 0;
node[i].num = i;
for (int j = 0; j < n; j++)
{
if (map[i * n + j] == 1)
node[i].degree++;
}
}
order(node, n);
for (int i = 0; i < n; i++)
{
for(int j=0;j<colorsize;j++)
{
if(node[i].color==0)
{
node[i].color = colors[j];
}
for (int k = 0; k < n; k++)
{
if (map[node[i].num * n + node[k].num] == 1 && node[k].color == node[i].color)
{
node[i].color = 0;
}
}
}
if (node[i].color == 0)
{
colorsize++;
colors[colorsize]=colorsize;
node[i].color = colors[colorsize];
}
}
}
int countcolor(Node node[],int n)
{
int b=node[0].color;
for (int i = 0; i < n-1; i++)
{
if (node[i].color < node[i + 1].color)
b = node[i + 1].color;
}
return b;
}
int main()
{
int n = 7;
paint(map, n);
cout << "需要的最少颜色数为:" << countcolor(node, n) << endl; // 添加输出语句
return 0;
}
代码说明:
map数组: 代表图的邻接矩阵,map[i * n + j] = 1表示节点i和节点j之间存在边。Node结构体: 用于存储每个节点的信息,包括节点编号num、颜色color和度数degree。order函数: 对节点数组进行排序,按节点度数降序排列。paint函数: 核心函数,执行图着色操作,使用贪心算法为每个节点分配颜色。countcolor函数: 计算使用的颜色数。
代码改进:
- 在
main函数中添加了输出语句,用于输出最终结果。 - 对代码进行了注释,解释每个步骤的含义。
执行结果:
执行代码后,将输出:
需要的最少颜色数为:3
这说明该图可以用 3 种颜色进行着色。
原文地址: https://www.cveoy.top/t/topic/oijr 著作权归作者所有。请勿转载和采集!