//program 5-3
#include <iostream>
#include <string.h>
#define MX 50
using namespace std;
int x[MX]; //解分量
int map[MX][MX]; //图的邻接矩阵
int sum=0; //记录解的个数
int n,m,edge; //节点数和颜色数
//创建邻接矩阵
void CreatMap()
{
int u,v;
cout << "请输入边数:";
cin >> edge;
memset(map,0,sizeof(map));//邻接矩阵里面的数据初始化为0,meset需要引入#include <string.h>
cout << "请依次输入有边相连的两个结点u和v,用空格分开:";
for(int i=1;i<=edge;i++)
{
cin>>u>>v;
map[u][v]=map[v][u]=1;
}
}
//约束条件
bool OK(int t)
{
for(int j=1;j<t;j++)
{
if(map[t][j]) //如果t与j邻接
{
if(x[j]==x[t]) //判断t与j的着色号是否相同
return false;
}
}
return true;
}
//搜索函数
void Backtrack(int t)
{
if(t>n) //到达叶子,找到一个着色方案
{
sum++;
cout<<"第"<<sum<<"种方案:";
for(int i=1;i<=n;i++) //输出该着色方案
cout<<x[i]<<" ";
cout<<endl;
}
else{
for(int i=1;i<=m;i++) //每个结点尝试m种颜色
{
x[t]=i;
if(OK(t))
Backtrack(t+1);
}
}
}
int main()
{
cout<<"输入节点数: ";
cin>>n;
cout<<"输入颜色数: ";
cin>>m;
cout<<"输入无向图的邻接矩阵:"<<endl;
CreatMap();
Backtrack(1);
}
//program 5-3
#include <iostream>
#include <string.h>
#define MX 50
using namespace std;
int x[MX]; //解分量
int map[MX][MX]; //图的邻接矩阵
int sum=0; //记录解的个数
int n,m,edge; //节点数和颜色数
//创建邻接矩阵
void CreatMap()
{
int u,v;
cout << "请输入边数:";
cin >> edge;
memset(map,0,sizeof(map));//邻接矩阵里面的数据初始化为0,meset需要引入#include <string.h>
cout << "请依次输入有边相连的两个结点u和v,用空格分开:";
for(int i=1;i<=edge;i++)
{
cin>>u>>v;
map[u][v]=map[v][u]=1;
}
}
//约束条件
bool OK(int t)
{
for(int j=1;j<t;j++)
{
if(map[t][j]) //如果t与j邻接
{
if(x[j]==x[t]) //判断t与j的着色号是否相同
return false;
}
}
return true;
}
//搜索函数
void Backtrack(int t)
{
if(t>n) //到达叶子,找到一个着色方案
{
sum++;
cout<<"第"<<sum<<"种方案:";
for(int i=1;i<=n;i++) //输出该着色方案
cout<<x[i]<<" ";
cout<<endl;
}
else{
for(int i=1;i<=m;i++) //每个结点尝试m种颜色
{
x[t]=i;
if(OK(t))
Backtrack(t+1);
}
}
}
int main()
{
cout<<"输入节点数: ";
cin>>n;
cout<<"输入颜色数: ";
cin>>m;
cout<<"输入无向图的邻接矩阵:"<<endl;
CreatMap();
Backtrack(1);
}