#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
#define maxn 10000
int road[maxn][maxn];//路径的邻接矩阵
int x[maxn];//解向量
int n;//顶点数
int m;//可选颜色个数
int sum;//解的个数
bool is_color(int t)//判断染色是否可行
{
for(int j=1; j<=n; j++)
{
if(road[t][j]==1&&x[t]==x[j])
return false;
}
return true;
}
void BackTrack(int t)
{
if(t>n)//到达叶子节点
{
sum++;//解个数加1
printf("第 %d 个解: ",sum);
for(int i=1; i<=n; i++)//输出当前解
{
cout<<x[i]<<" ";
}
cout<<endl<<endl;
}
else//未到达叶子节点
{
for(int i=1; i<=m; i++)
{
x[t]=i;//第t个节点染颜色i
if(is_color(t))//若染色可行递归下一层
BackTrack(t+1);
x[t]=0;//返回上一层
}
}
}
int main()
{
printf("输入顶点个数和可用颜色个数:\n");
cin>>n>>m;
int a,b;
printf("输入存在路径的两点(以-1 -1结束):\n");
while(cin>>a>>b)
{
if(a==-1&&b==-1)
break;
road[a][b]=1;
road[b][a]=1;
}
BackTrack(1);
cout<<"解的个数: ";
cout<<sum;
}
/*
5 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
-1 -1
*/
图的m着色问题
最新推荐文章于 2021-12-01 21:23:01 发布