算法设计与分析作业十二图的m着色问题

一、问题描述及解析:
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。
算法设计与分析作业十二图的m着色问题_第1张图片
二、算法核心步骤(伪代码)及图解:
算法设计与分析作业十二图的m着色问题_第2张图片
三、代码实现:

#include
#include
const int max=120;

int n,m,match;//顶点数,颜色数,边数
int c[max][max];//图的链接矩阵
int b[max];//当前的解
int sum=0;//方案数

bool A(int a)
{
    for (int i=1;i<=n;++i)
	{
        if(c[a][i]==1 && b[i]==b[a])
        {
        	return false;
		}
    }
    return true;
}

void Backtrack(int a)
{
    if (a>n)
	{
        sum++;
        for (int i=1;i<=n;++i)
        {
        	printf("%d ",b[i]);
		}
        printf("\n");
    }
    else
	{
        for (int i=1;i<=m;++i)
		{
            b[a] = i;
            if (A(a))
			{
				Backtrack(a+1);
			}
            b[a]=0;
        }
    }
}

int main()
{
    scanf("%d",&m);
    scanf("%d %d",&n,&match);
    for (int i=1;i<=match;++i)
	{
        int x, y;
        scanf("%d %d",&x,&y);
        c[x][y]=c[y][x]=1;
    }
    Backtrack(1);
    if (sum==0)
	{
		printf("NO\n");
	}
	else
	{
		printf("%d\n", sum);
	}
	return 0;
}

四、时间复杂度分析:
算法设计与分析作业十二图的m着色问题_第3张图片

你可能感兴趣的:(算法设计与分析作业十二图的m着色问题)