算法导论 · 回溯算法 · 图着色问题

  • 源代码
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100;
int n, edge, m = 4;
int g[maxn][maxn];
int x[maxn];

void MColoring(int k)    // x[1]=1, 其它分量初值为0
{   int j;
    while(1) {   
		while(1) {   
			x[k] = (x[k] + 1) % (m + 1); 
            if(x[k] == 0) return;  //如果颜色都试过了,则回溯
            for(j = 1; j <= k - 1; j++) { //否则的话,则检查与之前赋予颜色的邻 接点,看它们颜色是否会冲突
            	if((g[k][j] == 1) && (x[k] == x[j])) break;
			}    //冲突的话则终止检查其它邻接点
	        if(j == k) break;    //如果不冲突的话则停止试其下一种颜色,表示当前的x[k]取值不违反约束,退出while循环,继续往下
        }
        if(k == n) { 
			for(int i = 1; i <= n; i++) {
				printf("%d ", x[i]);
			} 
			printf("\n");
			return;
		}
        else MColoring(k+1);
    }
} 

int main() {
	freopen("graph.txt", "r", stdin);
	fill(g[0], g[0] + maxn * maxn, 0);
	scanf("%d%d", &n, &edge);
	while(edge--) {
		int a, b;
		scanf("%d%d", &a, &b);
		g[a][b] = 1;
		g[b][a] = 1;
	}
	
	MColoring(1);
	
	return 0;
}
  • 输入数据
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97566799