图的m着色问题

图的m着色问题
https://www.luogu.com.cn/problem/P2819

#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;

int f[MAXN][MAXN];//邻接矩阵存储
int color[105];//color[i] i节点图几号色 1 2 3 
int num;//可行涂色的方案数
/*
	pos节点涂色后判断pos相邻节点是否有相同色
	true 无相同颜色 继续涂下一个节点 
	false 有相同把color[pos]涂色清除 color[pos]=0 
*/ 
bool check(int pos){ 
	for(int i=1;i<=pos-1;i++){
		if(f[i][pos]==1 && color[i]==color[pos]){
			return false;
		}
	}
	return true;
}

/*
	对pos节点涂色 n+1个节点时 说明对n个节点涂色完成 输出一种方案 
	pos 对pos节点涂色 
	n   总节点数
	m   总颜色数 
*/ 
void dfs(int pos,int n,int m){
	if(pos==n+1){//明对n个节点涂色完成 输出一种方案
		num++;
		return;
	}else{
		//每个节点可以分别涂 1~m种色 
		for(int i=1;i<=m;i++){
			color[pos]=i;//涂第i种色 
			if(check(pos)==true){//pos相邻点没有相同色 
				dfs(pos+1,n,m);//继续涂下一个节点 
			}else{//相邻节点有相同色 
				color[pos]=0;//涂色恢复 尝试涂下一个色 
			}
		}
	}
}
int main(){
	int n,k,m;
	scanf("%d%d%d",&n,&k,&m);//输入n个节点 k条边 m种颜色 
	int x,y;
	for(int i=1;i<=k;i++){//输入每条边 
		scanf("%d%d",&x,&y);
		f[x][y]=1;
		f[y][x]=1;//无向图 
	}
	dfs(1,n,m);//第一个节点开始涂色 
	cout<<num;//输出方案数 
}
posted @ 2022-08-29 15:46  new-code  阅读(16)  评论(0编辑  收藏  举报