当前位置:嗨网首页>书籍在线阅读

26-实战演练

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.4.5 实战演练

//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);
}

算法实现和测试

(1)运行环境

Code::Blocks

(2)输入

输入节点数:7
输入颜色数:3
输入无向图的邻接矩阵:
请输入边数:12
请依次输入有边相连的两个结点u和v,用空格分开:
1 2
1 3
1 4
2 3
2 5
3 4
3 5
4 5
4 7
5 6
5 7
6 7

(3)输出

第1种方案:1 2 3 2 1 2 3
第2种方案:1 3 2 3 1 3 2
第3种方案:2 1 3 1 2 1 3
第4种方案:2 3 1 3 2 3 1
第5种方案:3 1 2 1 3 1 2
第6种方案:3 2 1 2 3 2 1