图的m-着色判定问题——给定无向连通图G和m种不同的颜色。
图的m-着色优化问题——若一个图最少需要m种颜
色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图
输入 n k m n代表节点个数,k代表边的个数
随后跟着k行a b 代表 a b间有一个边相连接, m代表颜色的种类数m的大小
一定能符合着色的标准
输出:
输出最少的颜色数
样例输入:
5 7 6
1 3
1 2
1 4
2 4
2 5
3 4
4 5
样例输出:
4
#include<stdio.h>
#define MAXVEX 10
typedef struct
{
int arc[MAXVEX][MAXVEX];
int numdian, numedge;
}MGraph;
int n, m, k;
MGraph G;
int number = 0;
bool visited[MAXVEX];
int color[MAXVEX];
bool flag;
void dfs(int num);
int colored_wide(int num, int co);
int is_unique(int num);
int main()
{
int i, j,h;
scanf("%d %d %d", &G.numdian, &G.numedge, &m);
for(i = 0; i < G.numdian; i++)
for(j = 0; j < G.numdian; j++)
{
G.arc[i][j] = 0;
}
for(i = 1; i <= G.numedge; i++)
{
scanf("%d %d",&j, &h);
G.arc[j][h] = 1;
G.arc[h][j] = 1;
}
for(i = 1; i <= G.numdian; i++)
{
//printf("num = %d, i = %d\n",number, i);
if(!visited[i])
{
dfs(i);
printf("%d\n",number);
}
}
return 0;
}
void dfs(int num)
{
int i;
if(num == G.numdian + 1)
{
// flag = 1;
return ;
}
for(i = 1; i <= m; i++)
{
if(!visited[num] && !colored_wide(num, i))//周围没有相同的颜色;
{
color[num] = i;
visited[num] = 1;
if(is_unique(i))
{
number++;
}
dfs(num + 1);
//if(flag = 1)
// return ;
}
}
}
int is_unique(int num)
{
int i;
for(i = 1; i <= G.numdian; i++)
{
if(color[i] == color[num] && num != i)
return 0;
}
return 1;
}
int colored_wide(int num, int co)
{
int i;
for(i = 1; i <= G.numdian; i++)
{
if(G.arc[num][i] && color[i] == co && num != i)
{
return 1;
}
}
return 0;
}