三着色问题
代码来源:https://blog.csdn.net/queeniewsy/article/details/117430955
原理讲解:https://www.bilibili.com/video/BV1gL411C79e/?spm_id_from=333.337.search-card.all.click&vd_source=6a3bfbe95b8018e73e56fdbed87453e0
#include <iostream>
using namespace std;
//无向图G为上图a
int G[5][5] = { {0,1,1,0,0},
{1,0,0,1,1},
{1,0,0,1,1},
{0,1,1,0,1},
{0,1,1,1,0} };
bool iscolor(int k, int *color) {//判断是否为合法颜色
for (int i = 0;i < 5 && i != k;i++) {//第k个顶点要跟前面k-1个已经选好颜色的顶点进行比较
if (G[k][i] == 1 && color[k] == color[i])//如果两个顶点连通且颜色一样那就不行
return false;
}
return true;
}
void output(int *color, int n) {//输出所有合法解
for (int i = 0;i < n;i++)
cout << color[i] << " ";
cout << endl;
}
void graphcolor(int k, int *color) {
for (int i = 1;i <= 3;i++) {//我们是三着色问题,所以只有三种颜色用于上色
color[k] = i;//着色1,2,3
if (iscolor(k, color)) {//合法解
if (k == 4)//且完全上好(一组)色了,这里k=4就是5个顶点都上好色了
output(color, 5);
else//部分合法解
graphcolor(k + 1, color);//到下一个顶点着色了
}
}
}
int main() {
//G的顶点的3着色
int color[5];//( x0 , x1 , x2 , x3 , x4 )顶点i所着颜色xi
for (int k = 0;k < 5;k++)
color[k] = 0;
graphcolor(0, color);//从0号顶点开始着色
return 0;
}