无向图染色

news/2024/11/22 18:14:05/

题目描述

给一个无向图染色,可以填红黑两种颜色,必须保证相邻两个节点不能同时为红色,输出有多少种不同的染色方案?


输入描述


第—行输入M(图中节点数)N(边数)
后续N行格式为:V1V2表示一个V1到V2的边。
数据范围: 1<=M<= 15,0 <=N<=M *3,不能保证所有节点都是连通的。


输出描述


输出一个数字表示染色方案的个数。


用例

输入

4 4
2 4
3 4
1 3
1 2

输出

7

说明

4个节点,4条边,1号节点和2号节点相连,2号节点和4号节点相连,3号节点和4号节点相连,
1号节点和3号节点相连,若想必须保证相邻两个节点不能同时为红色,总共7种方案。

思路

对每个节点可能的染色进行搜索。对每个未染色的节点分两种情况:当染黑色的情况下,不对其他节点产生影响;当染红色的情况下,要查找这个节点连接的所有边,找到相邻节点并直接规定为黑色。每当所有节点被染色完成就说明找到了一种结果,遍历所有可能后结束。

代码实现

import java.util.ArrayList;
import java.util.Scanner;class Main {public static class Side {int from;int to;public Side(int from, int to) {this.from = from;this.to = to;}}public static int[] pointsColor;public static ArrayList<Side> sideArrayList = new ArrayList<>();public static int result;public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] heads = in.nextLine().split(" ");int pointsNum = Integer.parseInt(heads[0]);int sidesNum = Integer.parseInt(heads[1]);for (int i = 0; i < sidesNum; i++) {String[] strings = in.nextLine().split(" ");Side side = new Side(Integer.parseInt(strings[0]) - 1, Integer.parseInt(strings[1]) - 1);sideArrayList.add(side);}pointsColor = new int[pointsNum];colored(0);System.out.println(result);}//0无 1黑 2红public static void colored(int current) {if (current < pointsColor.length) {//未染色if (pointsColor[current] == 0) {//黑pointsColor[current] = 1;colored(current + 1);//红pointsColor[current] = 2;for (Side side : sideArrayList) {//临边黑if (side.from == current) {pointsColor[side.to] = 1;}if (side.to == current) {pointsColor[side.from] = 1;}}colored(current + 1);} else {//如果已经染过则直接查找下一个点colored(current + 1);}//搜索完之后回退pointsColor[current] = 0;} else if (current == pointsColor.length) {result += 1;}}
}


http://www.ppmy.cn/news/765143.html

相关文章

Unity 导出AB包到手机部分Shader丢失解决方案记录。

1.Unity自带默认Shader丢失情况。 需要在 ProjectSettings/Graphics/AlwaysIncludedShaders 中将使用的Shader打入&#xff0c;建议不使用M默认Standard.shader。这个会导致包体大40M。建议自己实现。添加形式如图 2.自我编辑的Shader丢失&#xff0c;表现形式为在ab包中显示已…

JavaScript 数组排序函数sort()的使用

简介 sort&#xff08;&#xff09;方法是js中对于数组进行排序的函数。其可以方便快捷的实现对于数组的排序而不用我们自己编写排序方法。注&#xff1a;sort&#xff08;&#xff09;函数会直接改变原数组。 1.纯字符串数组排序 let myArray ["people","p…

javaScript 数组遍历的几种方法和对稀疏数组的处理

简介 数组的遍历方法又称为数组的迭代器方法&#xff0c;迭代器是程序设计中的一种软件设计模式&#xff0c;在js中&#xff0c;我们可以使用它来在数组中遍历而无需关心其内部实现的细节。   以下的遍历方法均不会对原数组产生影响&#xff0c;也就是说&#xff0c;我们如果…

【算法】约瑟夫环问题解析与实现

导言 约瑟夫环&#xff08;Josephus Problem&#xff09;是一个经典的数学问题&#xff0c;涉及一个编号为 1 到 n 的人围成一圈&#xff0c;从第一个人开始报数&#xff0c;报到某个数字 m 的人出列&#xff0c;然后再从下一个人开始报数&#xff0c;如此循环&#xff0c;直到…

Linux操作系统详解

文章目录 引言1. 认识Linux1.1 操作系统概述1.2 认识Linux1.3 虚拟机介绍1.4 远程连接Linux操作系统1.5 WSL1.6 虚拟机快照 2. Linux基础命令2.1 Linux的目录结构2.2 命令入门2.3 目录切换相关命令&#xff08;cd/pwd&#xff09;2.4 相对路径&#xff0c;绝对路径和特殊路径符…

鲍鱼的“几头”是什么意思?什么样的好吃?

鲍鱼自古以来就是山珍海味中的上品&#xff0c;尤其是大连地区出产的皱纹盘鲍&#xff0c;更是海鲜中的上品&#xff0c;也一直是高档宴席的抢手货&#xff0c;因此全国各地的高档宴席上所上的鲍鱼&#xff0c;前面都会标注为“大连鲍”。 我从小就生活在中国鲍鱼的主产区大连&…

2021年中国鲍鱼行业发展现状及进出口状况分析:鲍鱼产量连年上升 [图]

一、鲍鱼市场发展现状 鲍鱼&#xff0c;鲍科鲍属软体动物&#xff0c;分布于太平洋、大西洋和印度洋&#xff0c;被誉为“餐桌海珍之冠”海洋软黄金。鲍鱼身体外边包被着一个厚的石灰质的贝壳&#xff0c;单壁壳质地坚硬&#xff0c;软体部分有一个宽大扁平的肉足&#xff0c;为…

蒜蓉粉丝蒸扇贝鲍鱼

材料 扇贝&#xff0c;鲍鱼&#xff0c;龙口粉丝 大蒜&#xff0c;盐&#xff0c;姜&#xff0c;小葱 红椒&#xff0c;蒸鱼豉油&#xff0c;海鲜酱油&#xff0c;香油 做法 1、粉丝切成三段&#xff0c;用热水泡软&#xff0c;沥干备用。 2、大蒜、红椒切末&#xff0c;姜切丝…