博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图m的着色问题(搜索)
阅读量:5265 次
发布时间:2019-06-14

本文共 1289 字,大约阅读时间需要 4 分钟。

图的m着色问题
【问题描述】
       给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
【编程任务】
       对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
【输入格式】
       文件color.in输入数据。第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
【输出格式】
       程序运行结束时,将计算出的不同的着色方案数输出到文件color.out中。
【输入样例】
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
【输出样例】
48
在搜索的思维混乱了,加入search(1)是从第一个开始涂得意思,里面的的情况只是循环1-m种颜色,而我错误理解为开始涂得第一个有1-n个节点可以选择,
每个节点还有1-m个颜色可以选,然后我就炸了....然后上网上搜了一下。。orz
好了 说一下思路 每涂一个节点面临的情况都是涂一个和它前面后面都不样的颜色,所以要判断一下。
【代码】
#include
#include
#include
using namespace std;int n,k,m,sum;int search(int);bool paint[50];int pic[50][50],node[50];bool pd(int,int);int main(){int x,y;scanf("%d%d%d",&n,&k,&m);for(int i=1;i<=k;i++){scanf("%d%d",&x,&y);pic[x][y]=pic[y][x]=1;//相连 }search(1);printf("%d",sum);return 0;}int search(int x)//他的情况不是能涂哪个节点,因为我们就是从第一个开始涂色的,而是有m个颜色可涂; {if(x>n)sum++;elsefor(int i=1;i<=m;i++)//每一个有1-m种情况可以涂{if(pd(x,i))//第x个涂第i种颜色 {node[x]=i;//第x个涂第i个颜色,这里记录的原因是为判断一个点和他相邻的点是否一个颜色 search(x+1);node[x]=0;//回溯 }}}bool pd(int x,int j)//判断{for(int i=1;i<=n;i++){if(pic[x][i]&&node[i]==j)//如果与它相连并且与它将要涂的颜色一样 return 0;//返回假 }return 1;//否则真 }

 

转载于:https://www.cnblogs.com/zzyh/p/6623379.html

你可能感兴趣的文章
寄Android开发Gradle你需要知道的知识
查看>>
简述spring中常有的几种advice?
查看>>
整理推荐的CSS属性书写顺序
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>
反弹SHELL
查看>>
关闭Chrome浏览器的自动更新和升级提示
查看>>