相关概念:

  • 把相邻顶点染成不同颜色的问题叫做图的着色问题
  • ➢对图进行染色所需的最小颜色数,称为最小着色数。最小着色数为2的图称为二分图
  • ➢二分图:给定一个具有n个顶点的图,要给图上每个顶点染色,并且要使相邻的顶点的颜色不同、问是否最多用2种颜色进行染色?没有重边(相邻的两个顶点有两条边)和自环。

解题思路:

  用邻接表进行对图的表示,这样方便查找点的相邻顶点。深搜遍历每一个点,依次尝试每一种颜色;在深搜的过程中记录已标记的颜色。

代码如下:

邻接表类:

import java.util.ArrayList;
import java.util.List;/** 邻接表的头结点*/
public class GraphNodeAl {public int val;  //表示节点的位置public List<GraphNodeAl> neighbors; //节点所在的链表,存储所有与该节点相邻的节点public GraphNodeAl(int val){this.val = val;}//获取与节点相邻的节点ipublic GraphNodeAl getNeighbor(int i){return neighbors.get(i);}//添加与节点相邻的节点public void add(GraphNodeAl node){if(this.neighbors == null){this.neighbors =  new  ArrayList<GraphNodeAl>();}neighbors.add(node);}//返回与该节点相邻的节点个数public int size(){return this.neighbors.size();}
}

解题代码:

import 图的表示.GraphNodeAl;/** 判断给定的图是否是二分图*/
public class 二分图 {public static void main(String[] args) {//构建图的节点,这里从1开始计数MyNode n1 = new MyNode(1);MyNode n2 = new MyNode(2);MyNode n3 = new MyNode(3);MyNode n4 = new MyNode(4);n1.add(n2);n1.add(n4);n2.add(n1);n2.add(n3);n3.add(n2);n3.add(n4);n4.add(n1);n4.add(n3);//从任意的顶点开始遍历都可以System.out.println(dfs(n1,1));}//遍历图的顶点,判断是否能构成二分图, 用1和2表示两种颜色,0表示还没有上色private static boolean dfs(MyNode n1, int c) {n1.color = c;//依次尝试对相邻的顶点进行深搜for(int j=0; j<n1.size(); j++){MyNode nei = (MyNode)n1.getNeighbor(j);if(nei.color==c){   //与相邻的节点颜色相同return false;}if(nei.color==0){  //没有颜色if(!dfs(nei, f(c))){ //给邻居标记相反的颜色return false;}}}return true;}//取相反的颜色private static int f(int c) {if(c==1){return 2;}return 1;}
}class MyNode extends GraphNodeAl{public  int color; public MyNode(int val) {super(val);}public MyNode(int val, int color){super(val);this.color = color;}
}

解法二:
  上面的解法是深搜遍历图的方式解决的,相当于模拟在图中行走标记不同的颜色。
  我们其实也可以不把它当成一个图,然后深搜回溯的方式填充颜色。也就是说按照顺序给每一个节点依次标记颜色,每标记一个节点的颜色就进行一次判断看是否有相邻的节点发生颜色的冲突。
  如果有相邻的节点发生颜色的冲突,那就回溯,退回上一个节点尝试其他颜色。
  从深搜树过程上看,这样就会形成一个二叉树,因为每一个节点都有两种颜色的选择。

代码如下:

import 图的表示.GraphNodeAl;/** 判断给定的图是否是二分图*/
public class 二分图解法二 {private static MyNode[] arr = new MyNode[5];public static void main(String[] args) {//构建图的节点,这里从1开始计数arr[1] = new MyNode(1);arr[2] = new MyNode(2);arr[3] = new MyNode(3);arr[4] = new MyNode(4);arr[1].add(arr[2]);arr[1].add(arr[4]);arr[2].add(arr[1]);arr[2].add(arr[3]);arr[3].add(arr[2]);arr[3].add(arr[4]);arr[4].add(arr[1]);arr[4].add(arr[3]);//从任意的顶点开始遍历都可以System.out.println(dfs(arr,1));}private static boolean dfs(MyNode[] arr, int i) {for(int j=1; j<=2; j++){if(check(arr,i,j)){arr[i].color = j;if(i==arr.length-1){  //出口return true;}return dfs(arr, i+1);}}return false;}//判断节点i相邻的节点是否有颜色冲突private static boolean check(MyNode[] arr, int i, int j) {//遍历相邻的节点,对比颜色for(int k=0; k<arr[i].size(); k++){MyNode temp = (MyNode)arr[i].getNeighbor(k);if(j==temp.color){return false;}}return true;}}

图的着色问题(二分图)相关推荐

  1. 回溯法----图的着色问题

    图的着色问题 1.问题描述 图的m-着色判定问题--给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着 ...

  2. 【图的着色问题】算法设计与分析实验1

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...

  3. 作业12——分支限界解决最大团和图m着色问题

    1.问题 最大团:求一张无向图的最大团.团的定义:给定图G=(V,E),其中,V={1,-,n}是图G的顶点集,E是图G的边集,图G的团就是一个两两之间有边的顶点集合,团是G的一个完全子图.如果一个团 ...

  4. 作业12图的着色问题

    问题图的m着色问题.给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个 顶点一种颜色.如果要求G的每条边的两个顶点着不同颜色.给出所有可能的着色方 案:如果不存在,则回答"NO&qu ...

  5. 图的割点 图的割边 二分图

    枯木逢春不再茂,年少且惜镜边人 这周准备完结阿哈算法,其中有一章的学习不是很熟练(总之学的慢,忘的快.哎,真的,学完得好好从背包开始复习了,等复习完了,准备进行更深层次的学习,也就是从做题中获取知识, ...

  6. 【算法分析与设计】图的着色问题

    图的字典表示 下面的字典代表一个图: graph = {'B': ['C'],'C': ['B', 'D'],'D':

  7. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

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

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

  9. 【算法】二分图的判定

    二分图的判定 给定一个具有n个顶点的图.要给图上每个顶点染色,并且要使相邻的顶点颜色不同. 判断是否能最多用两种颜色进行染色.题目保证没有重边和自环. 概念:把相邻顶点染成不同颜色的问题叫做图的着色问 ...

最新文章

  1. 提高班第三周周记(中秋第三天)
  2. python数据库框架_Python数据库及ORM框架对比选择
  3. pyssdeep模块
  4. 关于生态、大数据和穿戴设备以及IT创新的畅想
  5. vue java 插件开发_实习模块vue+java小型全栈开发(三)
  6. 8个应该了解的CSS3技术
  7. hdu5375(格雷码问题+简单DP)
  8. TensorFlow——[基本图像分类]fashion-mnist及mnist_reader.py运行错误[TypeError: Invalid dimensions for image data]
  9. 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
  10. paip.c#.net托盘图标的建立使用总结
  11. 华为交换机console telnet 配置
  12. C语言ssh软件,如何在C语言程序中使用SSH。
  13. 【010】Excel宏编程相关封装模块(字体设置、写入表格内容)_003_#VBA
  14. 制作Windows官方系统启动盘
  15. 爬虫项目十八:用Python对拉钩网全部城市所有招聘信息爬取
  16. 计算机位置不可用d 桌面,win7系统D: 文档desktop引用了一个不可用的位置怎么办...
  17. 基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统
  18. iOS 视频直播技术
  19. numpy.random.rand(d0,d1....,dn)和numpy.random.randint()
  20. java 一个接口可以继承多个接口吗

热门文章

  1. 【目标检测数据集汇总】YOLO txt格式各种数据集
  2. 一个基于CC2530的智能恒温空调的具体案例
  3. Revit二次开发——向量判断平行与垂直
  4. 【印刷行业】RICOH MH5420和MH5440喷头(G5)
  5. 企业智能通信办公系统UCM6510领跑企业办公通信
  6. linux什么意思中文翻译,linux中文
  7. 网络安全学习记录-13
  8. JPEGmini Pro(电脑图片无损压缩工具)官方正式版V3.3.0.0 | 电脑版图片压缩软件免费下载
  9. iOS15.2 注册相册变化通知未给相册权限导致崩溃 [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self]
  10. 用于身份管理的区块链:需要考虑的影响