无向图染色_200分_A卷_dfs/回溯

无向图染色

题目描述:

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

输入输出描述:

输入描述:

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

输出描述:

  

示例1:

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

解题思路:

1、使用邻接表来记录下每个点的邻接点有哪些。
2、回溯/递归进行染色,如果当前节点已经被染色,则对下一个点染色;若当前节点没有被染色,则尝试染色黑色、红色(其邻接节点只能被染成黑色)是否违背染色规则。
3、在染色的过程中统计出有多少次没有违规染色的情况下,所有节点都被染色了。

代码:

// 记录那些点已经被染色
static int[] colored;
static int res;
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String[] split = scanner.nextLine().split(" ");
	int m = Integer.parseInt(split[0]);
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值