图论---图的m-点着色判定问题(回溯法--迭代式)
转自
图的m-着色判定问题——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?
图的m-着色优化问题——若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。
算法描述(迭代算法)
color[n]存储n个顶点的着色方案,可以选择的颜色为1到m
t=1->n
对当前第t个顶点开始着色:
if: t>n 则已求得一个解,输出着色方案即可
else: 依次对顶点t着色1-m,
if: t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;
else: 回溯,测试下一颜色。
///图着色问题回溯法
/**
无向图邻接矩阵示例
1 1 0 0 0
1 1 0 1 0
1 0 0 1 0
1 0 0 1 0
1 1 1 0 0
*/ #include "cstdio"
#include "cstring"
int color[];
bool ok(int k,int c[][])
{
for(int i=;i<k;i++)
{
if(c[k][i]==&&color[i]==color[k])///看已经着色的 与之相连的顶点和他同色与否?
return false;
}
return true;
}
int graphColor(int n,int m,int c[][])
{
int cnt=;
memset(color,,sizeof(color));
int k=;
while(k>=)
{
color[k]+=;///染第一种颜色
while(color[k]<=m)
{
if(ok(k,c))
break;
else
color[k]++;///搜索下一个颜色
}///挑选合适颜色
if(color[k]<=m&&k==n)///找完 输出
{
for(int i=;i<=n;i++)
printf("%d ",color[i]);
printf("\n");
cnt++;
}
else if(color[k]<=m&&k<n)
{
k++;///染下一个顶点
}
else
{
color[k]=;///回溯 找其他方法
k--;
}
}
return cnt;
}
int main()
{
int n,m,i,j;
int c[][];
printf("输入顶点数n和着色数m:\n");
scanf("%d %d",&n,&m);
printf("输入无向图的邻接矩阵:\n");
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&c[i][j]);
printf("着色所有可能的解:\n");
int cnt=graphColor(n,m,c);
printf("方案数: %d\n",cnt);
}
每一个程序,都在讲着自己的故事
写程序 讲故事
图论---图的m-点着色判定问题(回溯法--迭代式)的更多相关文章
- 算法java实现--回溯法--图的m着色问题
(转自:http://blog.csdn.net/lican19911221/article/details/26264471) 图的m着色问题的Java实现(回溯法) 具体问题描述以及C/C++实现 ...
- 回溯法 | 图的m着色问题
学习链接:算法 图的M着色问题 虽然今早9点才醒来,10点才来教室,但是coding得很高效.吃个早餐,拉个粑粑的时间,就把算法书上的[图的m着色]问题看明白了,大脑里也形成了解决问题的框架. 其实这 ...
- python 回溯法 子集树模板 系列 —— 8、图的遍历
问题 一个图: A --> B A --> C B --> C B --> D B --> E C --> A C --> D D --> C E -- ...
- python 回溯法 子集树模板 系列 —— 10、m着色问题
问题 图的m-着色判定问题 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着色优化问题 若一个图最少 ...
- 回溯法——最大团问题(Maximum Clique Problem, MCP)
概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...
- N-Queens And N-Queens II [LeetCode] + Generate Parentheses[LeetCode] + 回溯法
回溯法 百度百科:回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步又一次选择,这样的走不通就退回再走的技术为回溯法 ...
- 回溯法、数独与N阶可达问题
回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经 ...
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- python 回溯法 子集树模板 系列 —— 18、马踏棋盘
问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...
随机推荐
- C#文件重命名的代码
C#中没有重命名的方法,自己写了一个方法,来处理文件的重命名. /// <summary> /// 重命名文件夹内的所有子文件夹 /// </summary> /// < ...
- restAssured + TestNG测试接口,以下是一个get 请求。
package Elaine.Test.G.APITest; import org.testng.Assert;import org.testng.annotations.BeforeTest;imp ...
- Laravel 5.5 创建全局公共函数
一.需求 我在使用 Laravel 进行项目逻辑处理的时候要加载一些方法,需要全局调用 这个方法又必须得是一个全局函数,因此需要给 Laravel 创建全局的公共函数 二.实现 1.创建文件 在 ap ...
- Android之内容提供者ContentProvider的总结
本文包含以下知识点: ContentProvider Uri 的介绍 ContentResolver: 监听ContentProvider的数据改变 一:ContentProvider部分 Conte ...
- 官方文档 恢复备份指南七 Using Flashback Database and Restore Points
本章内容: Understanding Flashback Database, Restore Points and Guaranteed Restore Points Logging for Fla ...
- POJ 2161 Chandelier(动态规划)
Description Lamps-O-Matic company assembles very large chandeliers. A chandelier consists of multipl ...
- Postmortem Report 第一轮迭代事后分析报告
一.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件<BlueZ>是一款全新动作类塔防游戏.与市面上已经存在的塔防游戏不同 ...
- JavaWeb笔记(十二)日志
日志 日志信息根据用途与记录内容的不同,分为调试日志.运行日志.异常日志等. Java常用记录日志 logger log4j log4j2 logback 其中除了logger使用的概率较小,因此主要 ...
- markdown(自己看)
https://www.cnblogs.com/james-lee/p/6847906.html https://maxiang.io/
- 【SSH】——hql的使用方式及实现原理
[含义] hql,即Hibernate Query Language.它与我们熟知的sql很类似,它最大的特点就是对查询进行了面向对象的封装,下面会在具体例子中说明. sql查询的是数据库中的表或字 ...