图着色

图的m-着色判定问题——给定无向连通图Gm种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

图的m-着色优化问题——若一个图最少需要m种颜

色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值