华为OD机试 - 无向图染色(Python/JS/C/C++ 2024 E卷 100分)

news2024/10/4 11:13:22

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

二、输入描述

第一行输入M(图中节点数) N(边数)

后续N行格式为:V1 V2表示一个V1到V2的边。

数据范围:1 <= M <= 15, 0 <= N <= M * 3, 不能保证所有节点都是连通的。

三、输出描述

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

说明

0 < N < 15
0 <= M <= N * 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 0

2、输出

8

3、说明

没有任何边,所有节点可以自由染色。每个节点有2种选择,总共2^3=8种方案。

五、解题思路

题目要求在一个无向图中,用红色和黑色两种颜色对节点进行染色,且相邻的两个节点不能同时为红色。我们需要计算满足条件的不同染色方案的总数。

数据结构与算法选择

邻接表(Adjacency List):由于节点数较小(M ≤ 15),可以使用一个整数数组 adjacency 来表示每个节点的邻接关系。每个元素 adjacency[i] 用二进制位来表示节点 i 的邻居,方便进行位运算。

枚举所有子集(Bitmasking):由于节点数不超过15,可以通过枚举所有可能的节点子集(即所有可能的染色方案)来解决问题。每个子集对应一种将某些节点染为红色,其余染为黑色的方案。

验证独立集:对于每个子集,检查其中是否存在相邻的两个节点都被染为红色。如果不存在,则该子集对应的染色方案是有效的。

六、Python算法源码

# Python 代码实现
import sys

def main():
    import sys
    import math

    # 读取输入的所有内容并按行分割
    input = sys.stdin.read().split()
    idx = 0

    # 读取节点数M和边数N
    M = int(input[idx])
    idx += 1
    N = int(input[idx])
    idx += 1

    # 初始化邻接表,使用位掩码表示每个节点的邻居
    adjacency = [0] * M

    # 读取N条边,并构建邻接表
    for _ in range(N):
        V1 = int(input[idx]) - 1  # 转为0-based索引
        idx += 1
        V2 = int(input[idx]) - 1
        idx += 1
        adjacency[V1] |= (1 << V2)  # 将V2加入V1的邻居
        adjacency[V2] |= (1 << V1)  # 将V1加入V2的邻居

    # 初始化有效染色方案的计数
    count = 0
    total = 1 << M  # 计算2^M种染色方案

    # 遍历所有可能的染色方案
    for s in range(total):
        valid = True  # 标记当前方案是否有效
        for i in range(M):
            if ((s >> i) & 1) == 1:  # 如果节点i被染为红色
                if (s & adjacency[i]) != 0:  # 检查相邻节点是否也被染为红色
                    valid = False  # 当前方案无效
                    break  # 跳出内层循环
        if valid:
            count += 1  # 有效方案计数加一

    # 输出结果
    print(count)

# 调用主函数
if __name__ == "__main__":
    main()

七、JavaScript算法源码

// JavaScript 代码实现
const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];
rl.on('line', function(line){
    input = input.concat(line.trim().split(/\s+/));
}).on('close', function(){
    let idx = 0;
    // 读取节点数M和边数N
    const M = parseInt(input[idx++]);
    const N = parseInt(input[idx++]);

    // 初始化邻接表,使用位掩码表示每个节点的邻居
    const adjacency = new Array(M).fill(0);

    // 读取N条边,并构建邻接表
    for(let i = 0; i < N; i++){
        const V1 = parseInt(input[idx++]) - 1; // 转为0-based索引
        const V2 = parseInt(input[idx++]) - 1;
        adjacency[V1] |= (1 << V2); // 将V2加入V1的邻居
        adjacency[V2] |= (1 << V1); // 将V1加入V2的邻居
    }

    let count = 0;
    const total = 1 << M; // 计算2^M种染色方案

    // 遍历所有可能的染色方案
    for(let s = 0; s < total; s++){
        let valid = true; // 标记当前方案是否有效
        for(let i = 0; i < M; i++){
            if( ((s >> i) & 1) === 1 ){ // 如果节点i被染为红色
                if( (s & adjacency[i]) !== 0 ){ // 检查相邻节点是否也被染为红色
                    valid = false; // 当前方案无效
                    break; // 跳出内层循环
                }
            }
        }
        if(valid){
            count++; // 有效方案计数加一
        }
    }

    // 输出结果
    console.log(count);
});

八、C算法源码

// C 语言代码实现
#include <stdio.h>

int main(){
    int M, N;
    // 读取节点数M和边数N
    if(scanf("%d %d", &M, &N)!=2){
        return 0;
    }

    // 初始化邻接表,使用位掩码表示每个节点的邻居
    int adjacency[M];
    for(int i=0;i<M;i++){
        adjacency[i] = 0;
    }

    // 读取N条边,并构建邻接表
    for(int i=0;i<N;i++){
        int V1, V2;
        if(scanf("%d %d", &V1, &V2)!=2){
            return 0;
        }
        V1 -= 1; // 转为0-based索引
        V2 -= 1;
        adjacency[V1] |= (1 << V2); // 将V2加入V1的邻居
        adjacency[V2] |= (1 << V1); // 将V1加入V2的邻居
    }

    int count = 0;
    int total = 1 << M; // 计算2^M种染色方案

    // 遍历所有可能的染色方案
    for(int s=0; s < total; s++){
        int valid = 1; // 标记当前方案是否有效
        for(int i=0; i < M; i++){
            if( ((s >> i) & 1) == 1 ){ // 如果节点i被染为红色
                if( (s & adjacency[i]) != 0 ){ // 检查相邻节点是否也被染为红色
                    valid = 0; // 当前方案无效
                    break; // 跳出内层循环
                }
            }
        }
        if(valid){
            count++; // 有效方案计数加一
        }
    }

    // 输出结果
    printf("%d\n", count);
    return 0;
}

九、C++算法源码

// C++ 代码实现
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int M, N;
    // 读取节点数M和边数N
    cin >> M >> N;

    // 初始化邻接表,使用位掩码表示每个节点的邻居
    vector<int> adjacency(M, 0);

    // 读取N条边,并构建邻接表
    for(int i=0; i<N; i++){
        int V1, V2;
        cin >> V1 >> V2;
        V1 -= 1; // 转为0-based索引
        V2 -= 1;
        adjacency[V1] |= (1 << V2); // 将V2加入V1的邻居
        adjacency[V2] |= (1 << V1); // 将V1加入V2的邻居
    }

    int count = 0;
    int total = 1 << M; // 计算2^M种染色方案

    // 遍历所有可能的染色方案
    for(int s=0; s < total; s++){
        bool valid = true; // 标记当前方案是否有效
        for(int i=0; i < M; i++){
            if( ((s >> i) & 1) == 1 ){ // 如果节点i被染为红色
                if( (s & adjacency[i]) != 0 ){ // 检查相邻节点是否也被染为红色
                    valid = false; // 当前方案无效
                    break; // 跳出内层循环
                }
            }
        }
        if(valid){
            count++; // 有效方案计数加一
        }
    }

    // 输出结果
    cout << count << "\n";
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前缀和算法详解

对于查询区间和的问题&#xff0c;可以预处理出来一个前缀和数组 dp&#xff0c;数组中存储的是从下标 0 的位置到当前位置的区间和&#xff0c;这样只需要通过前缀和数组就可以快速的求出指定区间的和了&#xff0c;例如求 l ~ r 区间的和&#xff0c;就可以之间使用 dp[l - 1…

Java继承、final/protected说明、super/this辨析

目录 1.什么是继承 2.继承的特征 3.子类构造方法 4.super和this辨析 5.再谈初始化 6.protected关键字用法说明 7.final的用法说明 1.什么是继承 上面的这个animal就是基类&#xff0c;我们的这个dog和bird都是继承这个基类的特征&#xff0c;使用的是extends这个关键字&a…

【重学 MySQL】五十六、位类型

【重学 MySQL】五十六、位类型 定义赋值与使用注意事项应用场景 在MySQL数据库中&#xff0c;位类型&#xff08;BIT类型&#xff09;是一种用于存储位字段值的数据类型。 定义 BIT(n)表示n个位字段值&#xff0c;其中n是一个范围从1到64的整数。这意味着你可以存储从1位到64…

终于知道神秘的蓝莓真身了

黑森林实验室&#xff08;Black Forest Labs&#xff0c;简称 BFL&#xff09;是一家初创公司&#xff0c;由流行的 Stable Diffusion AI 图像生成模型的创建者创立&#xff0c;该模型是许多 AI 图像生成应用程序和服务&#xff08;如 Midjourney&#xff09;的基础。 这意味着…

github/git密钥配置与使用

零、前言 因为要在ubuntu上做点东西&#xff0c;发现git clone 的时候必须输账户密码&#xff0c;后来发现密码是token&#xff0c;但是token一大串太烦了&#xff0c;忙了一天发现可以通过配置 公钥 来 替代 http 的 部署方式。 一、生成 ssh 密钥对 我们先测试下能不能 连接…

Linux 信号详解

目录 一.前置知识 1.前台进程和后台进程 a.概念理解 b.相关指令 2.信号的前置知识 a.Linux 系统下信号的概念 b.进程对信号的处理方式 3.信号的底层机制 二.详解信号 1.信号的产生 a.键盘组合键 b.kill 指令和系统调用接口 ① kill 指令 ② kill() 系统调用接口 ③ raise() 系统…

Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化

上一篇完成的打标工作&#xff0c;是为了获取提示词&#xff0c;让AI认识和学习图片的特征。 因此&#xff0c;合适、恰当、无误的提示词&#xff0c;对最终模型效果是相当重要的。 Tag 如何优化 通过软件自动生成的 Tag 只是起到快速建立大体架构的作用&#xff0c;里面会涉…

2023年全国大学生数学建模竞赛C题——针对蔬菜类商品定价与补货决策的研究

摘要 本文针对生鲜超市中蔬菜类商品的补货和定价策略问题&#xff0c;建立时间序列预测模型&#xff0c;以及目标规划分析&#xff0c;从而让生鲜超市的收益达到最大。 针对问题一&#xff0c;首先对数据进行处理&#xff0c;对销售量异常值进行剔除、对缺失值补0 处理…

SOMEIP_ETS_150: SD_Send_triggerEventUINT8Multicast_Eventgroup_6

测试目的&#xff1a; 验证DUT在Tester订阅事件组后&#xff0c;能够响应Tester触发的triggerEventUINT8Multicast方法&#xff0c;并将TestEventUINT8Multicast事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&…

【nlp自然语言】知识图谱,全文检索,自然语言nlp,数据资产标签,集成管理平台

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

基于SpringBoot+Vue+MySQL的旅游网站

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会的不断发展和人们生活水平的提高&#xff0c;旅游活动逐渐成为人们生活中不可或缺的一部分。传统的旅游服务方式存在信息不对称、服务流程繁琐等问题。为了改善用户体验、提高服务效率&#xff0c;采用现代化的技术手段…

为什么说网站的可读性是引流量的重要环节

网站的可读性是指网站内容易于阅读和理解的程度。网站的可读性是引流量的重要环节&#xff0c;因为它直接影响到用户对网站内容的理解和吸收&#xff0c;进而影响用户的停留时间和转化率。以下是详细分析&#xff1a; 提升用户体验&#xff1a;网站的可读性好意味着用户可以更…

[uni-app]小兔鲜-06地址+sku+购物车

收址模块 准备 地址管理分包页面 和 添加地址分包页面 新增和修改地址 import type { AddressParams, AddressItem } from /types/address import { http } from /utils/http/*** 添加收货地址* param data 请求参数*/ export const postMemberAddressAPI (data: AddressPara…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(上篇)

Deforum 与 AnimateDiff 不太一样&#xff0c; AnimateDiff 是生成丝滑变化视频的&#xff0c;而 Deforum 的丝滑程度远远没有 AnimateDiff 好。 它是根据对比前面一帧的画面&#xff0c;然后不断生成新的相似图片&#xff0c;来组合成一个完整的视频。 Deforum 的优点在于可…

多模态系统中专家混合(MoE)复杂性的解读

引言 在迅速发展的人工智能领域&#xff0c;整合多种数据模态&#xff08;如文本、图像、音频和传感器数据&#xff09;是一个极具挑战性的任务。传统的单一模型AI系统通常难以应对同时处理多模态时产生的指数级复杂性。而这正是混合专家&#xff08;Mixture of Experts&#…

如何正确拆分数据集?常见方法最全汇总

将数据集划分为训练集&#xff08;Training&#xff09;和测试集&#xff08;Testing&#xff09;是机器学习和统计建模中的重要步骤&#xff1a; 训练集&#xff08;Training&#xff09;&#xff1a;一般来说 Train 训练集会进一步再分为 Train 训练集与 Validation 验证集两…

ElasticSearch备考 -- Update by query

一、题目 有个索引task&#xff0c;里面的文档长这样 现在需要添加一个字段all&#xff0c;这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起&#xff0c;组成一个新的字段&#xff0c;这个就需要脚本&#xff0c; 这里有两种方案&#xff…

geodatatool(地图资源下载工具)3.8更新

geodatatool&#xff08;地图资源下载工具&#xff09;3.8&#xff08;新&#xff09;修复更新&#xff0c;修复更新包括&#xff1a; 1.高德POI数据按行政区划下载功能完善。 2.修正高德POI数据类型重复问题。 3.对高德KEY数据访问量超过最大限制时&#xff0c;提示错误并终止…

RK3568平台(显示篇)车机图像显示偏白问题分析

一.显示偏白图片对比 正常图像: 偏白图像: 二.分析过程

手把手教你使用Tensorflow2.7完成人脸识别系统,web人脸识别(Flask框架)+pyqt界面,保姆级教程

目录 前言一、系统总流程设计二、环境安装1. 创建虚拟环境2.安装其他库 三、模型搭建1.采集数据集2. 数据预处理3.构建模型和训练 五、摄像头测试六、web界面搭建与pyqt界面搭建报错了并解决的方法总结 前言 随着人工智能的不断发展&#xff0c;机器学习和深度学习这门技术也越…