华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给一个无向图Q 染色,可以填红黑两种颜色,必须保证相邻的两个节点不能同时为红色,输出有多少种不同的染色方案?
二、输入描述
第一行输入M(图中节点数) N(边数)
后续N行格式为:V1 V2表示一个V1到V2的边。
数据范围:1 <= M <= 15, 0 <= N <= M * 3, 不能保证所有节点都是连通的。
三、输出描述
输出一个数字表示Q染色方案的个数。
说明
0 < n <= 15
0 <= N <= M * 3
0 <= s, t < n
不保证图连通
保证没有重复边和自环
四、测试用例
测试用例1:
1、输入
4 4
1 2
2 4
3 4
1 3
2、输出
7
3、说明
4个节点,4条边,1号节点和2号节点相连,
2号节点和4号节点相连,3号节点和4号节点相连,
1号节点和3号节点相连,
若想必须保证相邻两个节点不能同时为红色,总共7种方案。
测试用例2:
1、输入
3 3
1 2
1 3
2 3
2、输出
4
3、说明
3个节点,3条边。所有满足条件的染色方案共有4种。
五、解题思路
- 邻接表的构建:使用邻接表表示无向图,每个节点存储其相邻节点的列表。
- 回溯算法:通过回溯遍历所有可能的染色方案。对于每个节点,有两种选择:染为黑色或红色。
- 染为黑色:无需检查相邻节点,直接递归处理下一个节点。
- 染为红色:需要检查所有相邻节点是否已经染为红色。如果没有相邻节点染红,则可以染红,并继续递归处理下一个节点。
- 计数:每当所有节点都被处理完毕且满足条件时,计数加一。
六、Java算法源码
public class OdTest {private static int M; // 节点数private static int N; // 边数private static List<Integer>[] adj; // 邻接表private static int count = 0; // 有效染色方案计数public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取节点数M和边数NM = scanner.nextInt();N = scanner.nextInt();// 初始化邻接表adj = new ArrayList[M];for (int i = 0; i < M; i++) {adj[i] = new ArrayList<>();}// 读取N条边,构建无向图for (int i = 0; i < N; i++) {int u = scanner.nextInt() - 1; // 节点编号从1开始,转换为0-basedint v = scanner.nextInt() - 1;adj[u].add(v);adj[v].add(u);}// 开始回溯,从第0个节点开始backtrack(0, new boolean[M]);// 输出有效染色方案的数量System.out.println(count);scanner.close(); // 关闭扫描器}/*** 回溯函数,用于遍历所有可能的染色方案** @param node 当前处理的节点编号* @param red 当前已染为红色的节点集合*/private static void backtrack(int node, boolean[] red) {// 如果所有节点都已处理,增加计数if (node == M) {count++;return;}// 尝试将当前节点染为黑色backtrack(node + 1, red);// 尝试将当前节点染为红色boolean canBeRed = true;for (int neighbor : adj[node]) {if (red[neighbor]) {canBeRed = false; // 相邻节点已染红,不能染红break;}}if (canBeRed) {red[node] = true; // 将当前节点染为红色backtrack(node + 1, red);red[node] = false; // 回溯,撤销染色}}
}
七、效果展示
1、输入
4 6
1 2
1 3
1 4
2 3
2 4
3 4
2、输出
5
3、说明
完全图K4,所有节点互相连接。有效染色方案为:
所有节点黑色
1红,其余黑
2红,其余黑
3红,其余黑
4红,其余黑
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。