#include <stdio.h>
#include <stdlib.h>
int x[100];//当前解
int sum=0;//着色方案次数
int a[4][4]={0,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0};//表示对称矩阵
int m=0;//表示颜色个数
int n=0;//顶点的个数 默认顶点n为3
int sum2=0;
int main()
{
void backtrack(int t);
int ok(int k);
printf("请输入图的个数\n");
scanf("%d",&n);
//printf("请输入图对应的矩阵\n");
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%-3d",a[i][j]);
}
printf("\n");
}
printf("请输入颜色的个数\n");
scanf("%d",&m);
backtrack(1);
printf("有%d着色方案",sum);
}
void backtrack(int t){
if(t>n){
sum++;
for(int i=1;i<=n;i++){
printf("%d顶点的着色情况:%d\n",i,x[i]);
}
printf("----------------------------\n");
}
else{
for(int j=1;j<=m;j++){
x[t]=j;
if(ok(t)==1){
backtrack(t+1);
}
x[t]=0;//--------------不懂
}
}
}
int ok(int k){//子集树的那层 也就是表示图的顶点
for(int i=1;i<=n;i++){
if((a[k][i]==1)&&(x[i]==x[k])){
return 0;
}
}
return 1;
}
评论0
最新资源