华为OD机试真题 Java 实现【红黑图】【2023Q1 200分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、补充说明
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

在这里插入图片描述

一、题目描述

众所周知红黑树是一种平衡树,它最突出的特性就是不能有两个相邻的红色节点。

那我们定义一个红黑图,也就是一张无向图中,每个节点可能有红黑两种颜色,但我们必须保证没有两个相邻的红色节点。
现在给出一张未染色的图,只能染红黑两色,问总共有多少种染色方案使得它成为一个红黑图。

二、输入描述

第一行两个数字n m,表示图中有n个节点和m条边。

接下来共计m行,每行两个数字s t,表示一条连接节点s和节点t的边,节点编号为[0,n]。

三、输出描述

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

四、补充说明

0 0<=m <=n * 30<= s, t < n不保证图连通
保证没有重边和自环

五、解题思路

  1. 读取输入的节点数n和边数m。
  2. 创建一个空的列表list,用于存储边的信息。
  3. 循环m次,读取每条边的起始节点和结束节点,将其存储为一个长度为2的数组,然后添加到列表list中。
  4. 计算红黑图的可能性总数,假设有n个节点,那么总的可能性数为2的n次方。
  5. 初始化变量num为总的可能性数sum。
  6. 遍历从0到sum的所有可能性:
    • 对于每个可能性,遍历列表list中的每条边。
    • 使用位运算判断起始节点和结束节点是否都被染色(对应位为1)。
    • 如果起始节点和结束节点都被染色,表示出现了两个相邻的红色节点,将num减1,并结束当前遍历。
  7. 输出num作为结果。

六、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 节点数n
    int n = sc.nextInt();
    // 边数m
    int m = sc.nextInt();
    // 存储边的信息
    List<int[]> list = new LinkedList<>();
    for (int i = 0; i < m; i++) {
        // 起始节点
        int start = sc.nextInt();
        // 结束节点
        int end = sc.nextInt();
        int[] edge = {start, end};
        list.add(edge);
    }

    // 假设有n个节点,那么总的可能性数为2的n次方
    int sum = (int) Math.pow(2, n);
    // 初始化变量num为总的可能性数sum
    int num = sum;
    // 遍历从0到sum的所有可能性
    for (int i = 0; i < sum; i++) {
        // 对于每个可能性,遍历列表list中的每条边
        for (int[] edge : list) {
            // 使用位运算判断起始节点和结束节点是否都被染色
            int start = 1 << edge[0];
            int end = 1 << edge[1];
            // 如果起始节点和结束节点都被染色,表示出现了两个相邻的红色节点
            if ((start & i) != 0 && (end & i) != 0) {
                // 将num减1
                num--;
                // 结束当前遍历
                break;
            }
        }
    }
    System.out.println(num);
}

七、效果展示

1、输入

3 3
0 1
0 2
1 2

2、输出

4

华为OD机试真题 Java 实现【红黑图】【2023Q1 200分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,华为,java,程序人生,学习)