#include<bits/stdc++.h>
using namespace std;
#define M 100
int n,m,edge,sum=0;
int a[M][M];
int x[M];
void Createa(){ //建立邻接矩阵
int u,v;
cout<<"请输入变数:";
cin>>edge;
memset(a,0,sizeof(a));//
cout<<"依次输入有边连接的两个点";
for(int i=1;i<=edge;i++){
cin>>u>>v;
a[u][v]=a[v][u]=1;
}
}
bool IsSameColor(int t){
for(int j=1;j<t;j++){
if(a[t][j]){ //如果t与j节点有边
if(x[j]==x[t]) //判断色号是否相同
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++){
x[t]=i;
if(IsSameColor(t))
Backtrack(t+1);
}
}
}
int main(){
cout<<"输入节点数;";
cin>>n;
cout<<"输入颜色数:";
cin>>m;
cout<<"输入无向图的邻接矩阵"<<endl;
Createa();
Backtrack(1);
return 0;
}
图的M着色问题
最新推荐文章于 2024-08-12 16:55:46 发布