AOJ 894 (无向图的回溯着色法,四色)
来源:互联网 发布:金丝楠木淘宝店铺 编辑:程序博客网 时间:2024/06/03 20:05
接下来 M 行,每行一组数 A, B 表示 A, B 相邻
5 41 21 31 41 5
324
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点(即相邻顶点)着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
输入:无向图,m
输出:如果能,则输出方案
四色问题是m图着色问题的一个特例,根据四色原理,证明平面或球面上的任何地图的所有区域都至多可用四种颜色来着色,并使任何两个有一段公共边界的相邻区域没有相同的颜色。这个问题可转换成对一平面图的4着色判定问题(平面图是一个能画于平面上而边无任何交叉的图)。
将地图的每个区域变成一个结点,若两个区域相邻,则相应的结点用一条边连接起来。多年来,虽然已证明用5种颜色足以对任一幅地图着色,但是一直找不到一定要求多于4种颜色的地图。直到1976年这个问题才由爱普尔,黑肯和考西利用电子计算机的帮助得以解决。他们证明了4种颜色足以对任何地图着色。
#include<bits/stdc++.h>using namespace std;const int maxn=20;int Map[maxn][maxn];int color[maxn];//记录每个点的着色情况bool ok(int k)//判断顶点k的着色是否发生冲突{ for(int i=1;i<k;++i){ if(Map[k][i]==1&&color[i]==color[k]) return false; } return true;}int graphcolor(int n,int m){ int cnt=0; memset(color,0,sizeof(color)); int k=1;//k为顶点编号 while(k>=1) { color[k]+=1; while(color[k]<=m) { if(ok(k)) break; else color[k]++;//搜索下一个颜色 }//挑选合适颜色(不冲突) if(color[k]<=m&&k==n){ //for(int i=1;i<=n;++i) printf("%d ",color[i]); //printf("\n"); cnt++; } else if(color[k]<=m&&k<n) k++;//染下一个顶点 else{//回溯到父节点 color[k]=0; k--; } } return cnt;}int main(){ int n,m; scanf("%d %d",&n,&m); memset(Map,0,sizeof(Map)); for(int i=1;i<=m;++i){ int x,y; scanf("%d %d",&x,&y); Map[x][y]=1;//无向图 Map[y][x]=1; } printf("%d\n",graphcolor(n,4));//m=4,四色问题 return 0;}
图M着色问题用回溯法解决时,算法的时间上界可以通过计算解空间树种内结点的个数来估计,该问题中,解空间树中内结点数为n ,对于每一个结点,在最坏情况下,ok检查当前结点的每一个儿子所相应的颜色的可用性需耗时O(m *n);因此该方法的时间复杂度为: = nm(m^n-1)/(m-1)=O(nm^n);
本题中m=4 即为O(n* 4^n )
可以看出回溯法时间上就是在枚举,一共n个点,每个点4中可能颜色(4^n),然后每次判断这个点与n个点的合法性。回溯法代码较简洁,有深度优先搜索的思想。
- AOJ 894 (无向图的回溯着色法,四色)
- 图的m着色(回溯法)
- 图的着色问题-回溯法
- 回溯法---->图的着色问题
- 图的m着色问题-回溯法
- 图着色的回溯算法
- 回溯法 图着色问题
- 【aoj 】 幂集(回溯)
- 算法java实现--回溯法--图的m着色问题
- 回溯经典-m图着色问题(和地图4色问题的区别)
- 图的m着色问题(回溯法-满m叉树)
- 图的m着色问题(回溯)
- 回溯算法----图的M着色问题
- 图的着色问题-回溯解决
- 回溯——图的着色
- 用回溯法解决图着色问题
- 着色问题(回溯法)
- 回溯 图着色问题
- http2和http1相比有哪些重大改进
- mysql多表操作1以及存储过程的应用
- vagrant Linux虚拟机与win共享目录时的大小写问题(vagrant share folder/synced_folder case sensitivity)
- Java程序设计——模拟行星运动
- HDUOJ 2010 水仙花数
- AOJ 894 (无向图的回溯着色法,四色)
- JavaScript高级程序设计-学习笔记2
- HDOJ 2040 亲和数
- oracle 锁
- 腾讯2017暑期实习生编程题(第一道)
- java中的static关键字
- 设计模式-组合模式
- 单词接龙 p1019
- Java 循环