图的m着色问题

来源:互联网 发布:打击垫软件fade 编辑:程序博客网 时间:2024/05/21 06:52
/*******************************************************//*                    图的m着色问题                    *//*给定无向图G=(V,E),用m中颜色为图中每个顶点着色,要求  每个顶点着一种颜色,并使相邻两个顶点之间具有不同的颜色*//*******************************************************/#include<iostream>#define N 15  //最多顶点数#define M 10  //最多颜色数using namespace std;int main(){/*函数声明*/void creat_c(char B[], bool c[][M + 1], int n);void show_x(int x[], int n);bool ok(int x[], int k, bool c[][M+1], int n);void m_coloring(int count, int n, int m, int x[], bool c[][M+1]);int n, m;  //顶点个数n,颜色个数mcout << "请输入图的顶点个数(不超过15)及颜色个数(不超过10)分别为:";cin >> n >> m;char B[N + 1] ={'a','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'};bool(*c)[M + 1] = new bool[N + 1][M + 1];  //图的邻接关系cout << "\n请输入图<i,j>顶点若有边,则输1,否则输0:\n";creat_c(B,c,n);   //输入图的邻接关系int count = 0;    //解个数赋初值0int *x = new int[N+ 1]; //定义解向量cout << "图的"<<m<<"着色问题的解向量分别为:\n";m_coloring(count,n,m,x,c);  //图的m着色 回溯法求解 解向量system("pause");return 0;}/*输入图的邻接关系*/void creat_c(char B[],bool c[][M + 1], int n){for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){if (i == j){  //自身到自身,无关系c[i][j] = false;continue;}cout << "边<" << B[i] << "," << B[j] << ">: ";cin >>c[i][j];c[j][i] = c[i][j];  //无向图,邻接关系对称}}cout << endl;}/*打印解向量*/void show_x(int x[], int n){cout << x[1];for (int i = 2; i <= n; i++)cout << "->" << x[i];cout << endl;}/*判断当前顶点的着色是否为有效着色*/bool ok(int x[], int k, bool c[][M + 1], int n){for (int i = 1; i<=k; i++){if (c[k][i] && (x[k] == x[i]))return false;}return true;}/*图的m着色 回溯法求解 解向量*/void m_coloring(int count, int n, int m, int x[], bool c[][M + 1]){int k = 1;x[1] = 0;while (k>0){x[k] = x[k] + 1;  //从第一种颜色开始着色while ((x[k] <= m) && (!ok(x, k, c, n))) //判断当前顶点着色是否有效x[k] = x[k] + 1;   //不满足,换下一种颜色if (x[k] <= m){if (k == n ){      //如果是最后一个顶点show_x(x, n); count++;  //打印此解,并统计个数}else{k++; x[k] = 0;   //不是,则处理下一个顶点}}else{x[k] = 0; k--;   //第k顶点颜色复位为0,回溯到前一顶点}}cout << "共有" << count << "个解!\n\n";}

0 0
原创粉丝点击