华为机试 - 无向图染色

news2024/10/6 10:34:59

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

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

输入描述

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

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

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

输出描述

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

用例

输入4 4
1 2
2 4
3 4
1 3
输出7
说明

4个节点,4条边,1号节点和2号节点相连,

2号节点和4号节点相连,3号节点和4号节点相连,

1号节点和3号节点相连,

若想必须保证相邻两个节点不能同时为红色,总共7种方案。

题目解析

用例的染色方案,如下示意图:

相邻节点不能同时为红色

求一个连通图的染色方案,策略如下:
首先,必然有一种全黑方案。

 然后,我们找第一个点,即点1,找它的不相邻点,只有一个4,因此我们可以选择只给1染色,或者只给4染色,或者给1,4同时染色,这三个方案都符合要求

其实,这就是求1,4的全组合个数,即求 C(n,1) + C(n,2) + C(n,3) + ...... + C(n,n-1) + C(n,n) = (2^n) - 1

比如1,4有两个数,即一共有 (2^2) - 1 = 3 种。

按照上面这种策略,

继续找第二个点,即点2,其不相邻的只有点3,因此一共有(2^2) - 1 = 3 种染色方案

继续找第三个点,即点3,其不相邻的只有点2,因此一共有(2^2) - 1 = 3 种染色方案

继续找第四个点,即点4,其不相邻的只有点1,因此一共有(2^2) - 1 = 3 种染色方案

此时,我们发现除了全黑的染色方案外,一共有3*4 = 12种染色方案,但是实际上只有6种

整整多了一倍。

原因很简单,我们在统计第一个点的染色方案时,其实把第四个点的也统计了。统计第二个点时,把第三个点的染色方案也统计了。

因此后面对于第三个点和第四个点染色方案统计是重复的。 

因此,可得连通图的染色方案数目统计代码如下:

入参arr,即图中所有边 [v1, v2],

入参m,即图中点的数量

// 连通图的染色方案
function getDyeCount(arr, m) {
  const graph = {};

  for (let [v1, v2] of arr) {
    graph[v1] ? graph[v1].push(v2) : (graph[v1] = [v2]);
    graph[v2] ? graph[v2].push(v1) : (graph[v2] = [v1]);
  }

  let count = 0;
  for (let v in graph) {
    const n = m - graph[v].length;
    count += (1 << n) - 1; // (2 ^ n) - 1
  }

  return (count >>> 1) + 1; // +1 对应全黑染色方案,count >>> 1 即 count / 2
}

本题,到此还未结束,因为题目中有一句话:

不能保证所有节点都是连通的

这说明什么呢?即,可能会出现下面这种情况:

那么此时染色方案该如何统计呢?

题目和用例都没有说明清楚。。。。

我理解,应该统计每个连通分量的染色方案个数,然后求和作为题解。

即先统计1,2,3,4连通分量的染色方案个数为7,再统计5连通分量的染色方案为2,即一共有9个染色方案。

因此,本题还考察了连通分量的求解。

连通分量的求解可以使用并查集,关于并查集知识请看:华为机试 - 发广播_伏城之外的博客-CSDN博客 

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

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

const lines = [];
let m, n;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [m, n] = lines[0].split(" ").map(Number);
  }

  if (n !== undefined && lines.length === n + 1) {
    const arr = lines.slice(1).map((line) => line.split(" ").map(Number));

    console.log(getResult(arr, m));

    lines.length = 0;
  }
});

/**
 *
 * @param {*} arr 边,即[v1, v2]
 * @param {*} m 点数量
 */
function getResult(arr, m) {
  const ufs = new UnionFindSet(m);

  for (let [v1, v2] of arr) {
    ufs.union(v1, v2);
  }

  const cates = {}; // cates对象每个属性对应一个连通分量
  for (let i = 1; i < ufs.fa.length; i++) {
    let fa = (ufs.fa[i] = ufs.find(i));
    cates[fa] ? cates[fa].push(i) : (cates[fa] = [i]);
  }

  let count = 0;
  for (let k in cates) {
    // 连通分量中点的个数
    const len = cates[k].length;
    const set = new Set(cates[k]);
    // 如果输入1~n+1行的边中还有连通分量中的点,则将边计入同一个连通图connect中
    const connected = arr.filter(([v1, v2]) => set.has(v1) || set.has(v2));
    // 求连通图的染色方案个数
    count += getDyeCount(connected, len);
  }

  return count;
}

// 并查集
class UnionFindSet {
  constructor(n) {
    this.fa = new Array(n + 1).fill(0).map((_, i) => i);
  }

  find(x) {
    if (x !== this.fa[x]) {
      return (this.fa[x] = this.find(this.fa[x]));
    }
    return x;
  }

  union(x, y) {
    const x_fa = this.find(x);
    const y_fa = this.find(y);

    if (x_fa !== y_fa) {
      this.fa[y_fa] = x_fa;
    }
  }
}

// 连通图的染色方案
function getDyeCount(arr, m) {
  const graph = {};

  for (let [v1, v2] of arr) {
    graph[v1] ? graph[v1].push(v2) : (graph[v1] = [v2]);
    graph[v2] ? graph[v2].push(v1) : (graph[v2] = [v1]);
  }

  let count = 0;
  for (let v in graph) {
    const n = m - graph[v].length;
    count += (1 << n) - 1; // (2 ^ n) - 1
  }

  return (count >>> 1) + 1; // +1 对应全黑染色方案,count >>> 1 即 count / 2
}

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

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

相关文章

使用reshape2 R包进行在线长数据和宽数据相互转化

数据是数据分析的基础。我们常见的数据一般存储在excel表格&#xff0c;或者txt文档中。今天我们来看看长数据和宽数据&#xff0c;以及如何进行两者之间的相互转换。 1&#xff0e;宽数据和长数据 宽数据 如图1所示&#xff0c;宽数据是我们最常见的数据存储形式&#xff0c…

[附源码]Python计算机毕业设计Django校园订餐管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

nginx配置文件组成

1.配置文件的组成 ​ 配置文件由全局块events块http块组成 1.1 全局块 ​ 从配置文件开始到events之间的内容&#xff0c;主要会设置一些影响Nginx服务器整体运行的配置指令&#xff0c;主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数&#xff0c;进程pid…

Java数据结构与Java算法学习Day06---堆(简略笔记记录)

目录 一、堆 96 1.1堆的定义 96 1.2堆的API设计 97 1.3堆---堆的插入方法 98 1.4堆---堆的删除最大元素方法 99 1.5堆---堆的测试 100 二、堆排序 101 2.1堆排序 101 一、堆 96 1.1堆的定义 96 堆实际上也是利用数据结构实现的&#xff0c;用树实现的特殊结构&…

(mac M1)Flutter环境搭建

下载Flutter SDK&#xff0c;需要科学上网。 将Flutter永久添加到PATH中 1 sudo vim ~/.bash_profile 打开文件 2 export PATHpwd/flutter/bin:$PATH 将这个添加到前几行环境变量设置中 3 :wq 退出vim 4 source ~/.bash_profile 配置马上生效命令 运行 flutter doctor 命令&a…

【Linux】yum的介绍和使用

本期主题&#xff1a;yum介绍和使用博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐作为程序员&#xff0c;不会有人还没女朋友吧。 目录 &#x1f341;1.软件包是什么&#xff1f; &#x1f341;…

[附源码]Python计算机毕业设计Django小型银行管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Qwt开发笔记(二):Qwt基础框架介绍、折线图介绍、折线图Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128194710 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

单片机硬件和软件延时、RTOS相对延时和绝对延时

已剪辑自: https://mp.weixin.qq.com/s/-RPLQn4KO9Aqu1fpfZeOKA 前不久有个读者在问关于延时的问题&#xff0c;大概就是问&#xff1a;软件延时和硬件延时是啥意思&#xff1f;做项目时他俩有什么区别&#xff1f; 今天就来讲讲关于硬件延时和软件延时的内容&#xff0c;以及…

[GitHub]将本地文件上传远程仓库(安装,创建SSHKey,上传远程仓库)

目录 什么是GitHub 注册账户以及创建仓库 安装Git 配置Git ​编辑 将本地项目上传远程仓库 创建本地仓库 创建远程仓库 克隆远程仓库到本地 什么是GitHub github是一个基于git的代码托管平台&#xff0c;付费用户可以建私人仓库&#xff0c;我们一般的免费用户只能使用公共…

Android 动画实现 从基础到自定义

1. 基础使用 由于是继承了ValueAnimator类 所以使用的方法十分类似&#xff1a;XML 设置 / Java设置1.1 Java设置 ObjectAnimator animator ObjectAnimator.ofFloat(Object object, String property, float ....values); // Object object&#xff1a;需要操作的对象 // Str…

【SpringCloud负载均衡】【源码+图解】【二】LoadBalancer配置

【SpringCloud负载均衡】【源码图解】【一】LoadBalancer的HelloWorld体验 目录2. LoadBalancer的配置2.1 config.LoadBalancerAutoConfiguration2.2 BlockingLoadBalancerClientAutoConfiguration2.3 LoadBalancerEurekaAutoConfiguration2.4 loadbalancer.LoadBalancerAutoCo…

[附源码]Python计算机毕业设计SSM建筑材料采购管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

引擎入门 | Unity UI简介–第2部分(5)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 9.设置动画对话框 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第五篇。 9.设置动画对…

css:css属性pointer-events实现点击穿透

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events pointer-events CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target 常用属性 /* Keyword values */ pointer-events: auto; /* 与pointer-events属性未指定时的表现效…

jsp+servlet+mysql实现的学生签到考勤请假管理系统源码+教程

今天给大家演示一下由jsp servlet mysql实现的一款学生签到管理系统&#xff0c;系统主要分管理员、学生、辅导员、教师等角色登录&#xff0c;实现学生发起请假、教师辅导员审批等动作&#xff0c;该项目不仅源码完整&#xff0c;还带有完整的论文文档&#xff0c;数据库设计说…

Linux下普通用户(非root用户)安装Java,Java程序能编译不能运行的原因

Linux下普通用户&#xff08;非root用户&#xff09;安装Java1. 下载2. 解压缩3. 修改环境变量4. 验证5. 第一个Java程序1. 下载 根据自己的系统&#xff0c;从官网上直接下载即可。本文以jdk-8u202-linux-x64.tar.gz为例。 2. 解压缩 使用以下命令解压 tar -zxvf jdk-8u2…

【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数据集、演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、问答智能客服简介 QA问答是Question-and-Answer的缩写&#xff0c;根据用户提出的问题检索答案&#xff0c;并用用户可以理解的自然语言回答用户&#xff0c;问答型客服注重一问一答处理&#xff0c;侧重知识的推理。 …