博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法——四处碰壁回溯法02图解回溯
阅读量:3958 次
发布时间:2019-05-24

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

算法——四处碰壁回溯法02图解回溯

文章目录

一.图着色问题

问题描述:

给定无向连通图G=(V,E),求最小的整数m,用m种颜色是的对G中任意相连的顶点颜色不一致。

算法过程:

初始化定义数组color[n],其值全为0,同时将color[0]赋值1,表示节点涂上颜色1,设一个计数器k=1;表示已经有一个节点涂上颜色。
while(k<n)
①对color[k]开始颜色搜索,如果找到第一个没有颜色冲突的颜色(当然这个颜色值必然是小于m的)就为其赋值,进入②,否则进入③。
②k=k+1;处理下一个节点
③color[k]=0;k=k-1,进行回溯
循环结束返回true
算法复杂度分析:
用m种颜色来涂n节点的连通图,那么我们这里举一个例子,如图(m=3,n=5):

在这里插入图片描述

那么这个问题再回溯的过程中对应的是一个子集树。过程如下:在这里插入图片描述
上面的5,6是被抛弃的子集树的节点。最后使用的是1,2,4,7,14
代码实现:

import org.junit.Test;/** * @author jackTan */public class AlgrithimTest {
@Test public void Test(){
int edges[][] = {
{
0,1,1,0,0}, {
1,0,1,1,1}, {
1,1,0,0,1}, {
0,1,0,0,1}, {
0,1,1,1,0} }; int[] ints = GraphColor(edges, 3); for (int anInt : ints) {
System.out.print(anInt+" "); } } int[] GraphColor(int [][]edges,int m){
int n = edges.length; int []color = new int[n]; color[0]=1; int k=1; while(k

输出:

在这里插入图片描述

二.哈密顿回路问题

这个问题也可以用动态规划来解决,可以参见这篇文章:

问题描述: 给定无向连通图G,邱一条从顶点0出发经过所有城市再回到0的哈密顿回路。

算法过程:

初始化数组visited[n];赋值全为0表示都未被访问过。利用x[n]来存储哈密顿回路的节点顺序,x[n]全为0。

从顶点0出发,那么visited[0]=1;x[0]=0;k=1(记录下一个要标记的顶点)
while(k<=n-1){
x[k]++;
{循环,若x[k]未被访问过且x[k-1]到x[k]有边且k<n就跳出,否则就x[k]++}
{若k==n则,k–,x[k]=0;
否则k++;}
}

下面代码演示的是下面这张图:

在这里插入图片描述
代码实现:

import org.junit.Test;/** * @author jackTan */public class AlgrithimTest {
@Test public void Test(){
int edges[][] = {
{
0,1,0,1,0}, {
1,0,1,0,1}, {
0,1,0,1,1}, {
1,0,1,0,1}, {
0,1,1,1,0} }; int[] ints = Hamiton(edges); for (int anInt : ints) {
System.out.print(anInt+1+" "); } } int[] Hamiton(int [][]edges){
int n = edges.length; int []visited = new int[n]; int []x = new int[n]; visited[0]=1; x[0]=0; int k=1; while(k<=n-1){
x[k]++; while(x[k]<=n-1&&!IsOK(edges,x,visited,k)){
x[k]++; } if(x[k]==n){
visited[x[k-1]]=0; x[k]=0; k--; }else{
visited[x[k]]=1; k++; } if(k==n&&edges[x[k-1]][0]==0){
visited[x[k-1]]=0; k--; } } return x; } boolean IsOK(int [][]edges,int x[],int []visited,int k){
if(edges[x[k-1]][x[k]]==1&&visited[x[k]]==0){
return true; }else {
return false; } }}

在这里插入图片描述

转载地址:http://ztlzi.baihongyu.com/

你可能感兴趣的文章
linux export命令参数及用法详解--linux设置环境变量命令
查看>>
Shell单引号,双引号,反引号,反斜杠
查看>>
Qt中内存泄露和退出崩溃的问题
查看>>
常见颜色
查看>>
Source Insight 经典教程
查看>>
快速打开菜单附件中的工具
查看>>
Windows系统进程间通信
查看>>
linux exec的用法
查看>>
C语言中如何使用宏
查看>>
Http与RPC通信协议的比较
查看>>
Source Insight的对齐问题
查看>>
ubuntu设置开机默认进入字符界面方法
查看>>
chrome 快捷键
查看>>
Linux下buffer和cache的区别
查看>>
程序员不应该再犯的五大编程错误
查看>>
utf8中文编码范围
查看>>
oracle中文(utf8)按拼音排序的简单解决方案
查看>>
[转载][转帖]Hibernate与Sleep的区别
查看>>
Linux系统的默认编码设置
查看>>
Linux系统调用
查看>>