问题 C: 【回溯】图的m着色问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 1  解决: 1
[提交][状态][讨论版]

题目描述

给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色?
        这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
        编程计算:给定图G=(V, E)和m种不同的颜色,找出所有不同的着色法和着色总数。

输入

第一行是顶点的个数n(2≤n≤10),颜色数m(1≤m≤n)。
接下来是顶点之间的相互关系:a b
表示a和b相邻。当a,b同时为0时表示输入结束。

输出

输出所有的着色方案,表示某个顶点涂某种颜色号,每个数字的后面有一个空格。最后一行是着色方案总数。

样例输入

  1. 5 4
  2. 1 3
  3. 1 2
  4. 1 4
  5. 2 3
  6. 2 4
  7. 2 5
  8. 3 4
  9. 4 5
  10. 0 0

样例输出

  1. 1 2 3 4 1
  2. 1 2 3 4 3
  3. 1 2 4 3 1
  4. 1 2 4 3 4
  5. 1 3 2 4 1
  6. 1 3 2 4 2
  7. 1 3 4 2 1
  8. 1 3 4 2 4
  9. 1 4 2 3 1
  10. 1 4 2 3 2
  11. 1 4 3 2 1
  12. 1 4 3 2 3
  13. 2 1 3 4 2
  14. 2 1 3 4 3
  15. 2 1 4 3 2
  16. 2 1 4 3 4
  17. 2 3 1 4 1
  18. 2 3 1 4 2
  19. 2 3 4 1 2
  20. 2 3 4 1 4
  21. 2 4 1 3 1
  22. 2 4 1 3 2
  23. 2 4 3 1 2
  24. 2 4 3 1 3
  25. 3 1 2 4 2
  26. 3 1 2 4 3
  27. 3 1 4 2 3
  28. 3 1 4 2 4
  29. 3 2 1 4 1
  30. 3 2 1 4 3
  31. 3 2 4 1 3
  32. 3 2 4 1 4
  33. 3 4 1 2 1
  34. 3 4 1 2 3
  35. 3 4 2 1 2
  36. 3 4 2 1 3
  37. 4 1 2 3 2
  38. 4 1 2 3 4
  39. 4 1 3 2 3
  40. 4 1 3 2 4
  41. 4 2 1 3 1
  42. 4 2 1 3 4
  43. 4 2 3 1 3
  44. 4 2 3 1 4
  45. 4 3 1 2 1
  46. 4 3 1 2 4
  47. 4 3 2 1 2
  48. 4 3 2 1 4
  49. Total=48

解题思路:使用回溯法,具体步骤是将cur=1传入backtrack(),即从第一个开始涂色。

  涂的时候从颜色1开始到m,每当涂上一个色,要用ok(cur)判断第cur个点是否可以涂这个色,不可以的话就不再往下涂了,改试另一个颜色,可以的话就继续。

    当cur>n的时候即前n个点都涂完了,然后输出结果并cou++计数。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. int n,m;
  7. int a=,b=;
  8. int cou=;
  9. int graph[][]={};
  10. int color[]={};
  11.  
  12. bool ok(int c){
  13. for(int k=;k<=n;k++){
  14. if(graph[c][k]&&color[c]==color[k]){
  15. return false;
  16. }
  17. }
  18. return true;
  19. }
  20.  
  21. void backtrack(int cur){
  22. if(cur>n){
  23. for(int i=;i<=n;i++){
  24. printf("%d ",color[i]);
  25. }
  26. cou++;
  27. printf("\n");
  28. }else{
  29. for(int i=;i<=m;i++){
  30. color[cur]=i;
  31. if(ok(cur)){
  32. backtrack(cur+);
  33. }
  34. color[cur]=;
  35. }
  36. }
  37. }
  38.  
  39. int main()
  40. {
  41. scanf("%d %d",&n,&m);
  42. while(scanf("%d %d",&a,&b)!=EOF&&a!=&&b!=){
  43. graph[a][b]=;
  44. graph[b][a]=;
  45. }
  46. backtrack();
  47. printf("Total=%d",cou);
  48. return ;
  49. }

【回溯】图的m着色问题的更多相关文章

  1. 编程之美:1.9高效率安排见面会 图的m着色问题 回溯法

    原书问题,可以转换为图的m着色问题 ,下面该问题的代码 这里有参考ppt与code,免积分载 http://download.csdn.net/detail/u011467621/6341195 // ...

  2. 图的m着色问题 (回溯搜索)

    图的m着色问题 [问题描述]        给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...

  3. 算法java实现--回溯法--图的m着色问题

    (转自:http://blog.csdn.net/lican19911221/article/details/26264471) 图的m着色问题的Java实现(回溯法) 具体问题描述以及C/C++实现 ...

  4. 回溯法 | 图的m着色问题

    学习链接:算法 图的M着色问题 虽然今早9点才醒来,10点才来教室,但是coding得很高效.吃个早餐,拉个粑粑的时间,就把算法书上的[图的m着色]问题看明白了,大脑里也形成了解决问题的框架. 其实这 ...

  5. [题解]图的m着色问题

    图的m着色问题(color) [题目描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...

  6. 图的M 着色问题

    题目描述给定无向连通图G 和M 种不同的颜色,用这些颜色为图G 的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G 中每条边的2 个顶点着不同的颜色,则称这个图是M 可着色的.图的M 着色问题是对 ...

  7. 图m的着色问题(搜索)

    图的m着色问题 [问题描述]        给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...

  8. P2819 图的m着色问题 洛谷

    https://www.luogu.org/problem/show?pid=2819 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使 ...

  9. P2819 图的m着色问题

    题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m ...

随机推荐

  1. Gallery 图片画廊

    Gallery 图片画廊 学习网址http://amazeui.org/widgets/gallery?_ver=2.x

  2. 在excel批量更改单元格类型后的批量刷新显示

    把E的东西变成完整显示 解决办法: 选中所需要更改的整列数据------>菜单栏的数据选项------>分列

  3. IOS基础之 (十二) Block

    一 定义 Block封装了一段代码,可以在任何时候执行. Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 二 使用 1. 定义函数指针,然后在实现. #import & ...

  4. IOS基础之 (二) 面向对象思想

    编写Objective-C程序时,要使用Foundation框架. 什么是框架? 框架(framework)是由很多类(class)组成的库,可以用来编写程序. 对象(Object) 对象可以保存数据 ...

  5. 浅谈php对api开发的作用

    最近正在做一个手机APP的服务端API开发,虽然是基于Ruby on Rails的,做的也不太专业,不过大致相通,希望能够给你一些启发. 首先,如果是比较简单的手机APP,例如新闻客户端这样的不会涉及 ...

  6. php中图片文件的导入,上传与下载

    ---------------------------------------------图片的导入-------------------------------------------------- ...

  7. 锋利的jQuery-4--图片切换的一个例子(自己理解后写的,以备忘记时看看)

    一个动画切换的效果,如图: 分析步骤: 1.点击左右的箭头图片滚动,左边的小点变化. 2.主要问题是当滚到最后一屏时切换回第一屏,第一屏在向前滚动是切换到最后一屏 :通过判断图片的总数然后除以每屏显示 ...

  8. Netbeans连接数据库

    /* Netbeans连接数据库 NetBeans项目的“项目属性”中“库”一栏中.Tab页“编译和运行”中已经加上jdbc的驱动文件 */ Connection conn = null;//连接数据 ...

  9. 新浪微博客户端(23)-计算Cell内控件的frame

    DJStatusCellFrame.m #import "DJStatusCellFrame.h" #import "DJStatus.h" #import & ...

  10. Android Studio 设置不自动缩进匿名内部类

    Android Studio 会默认缩进匿名内部类代码,这让人感觉有些不大适应,可以使用下面的方法进行取消. 取消选中橙色框前的几个复选框即可.