【编程题目 | 200分】服务器广播 [ 200 / 困难 ]

服务器广播

题目描述:

服务器连接方式包括直接相连,间接连接。A 和 B 直接连接,B 和 C 直接连接,则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。

  • 给出一个 N*N 数组,代表 N 个服务器,matrix[i][j]==1,则代表 i 和 j 直接连接;
  • 不等于 1 时,代表 i 和 j 不直接连接。
  • matrix[i][i]==1,即自己和自己直接连接。matrix[i][j]==matrix[j][i]。

计算初始需要给几台服务器广播,才可以使每个服务器都收到广播。

输入描述

输入为N行,每行有N个数字,为0或1,由空格分隔,构成N*N的数组,N的范围为 1<=N<=50

输出描述

输出一个数字,为需要广播的服务器数量

示例 1:

输入

1 0 0
0 1 0
0 0 1

输出

3

说明

3台服务器互不连接,所以需要分别广播这3台服务器

示例 1:

输入

1 1
1 1

输出

1

说明

2台服务器相互连接,所以只需要广播其中一台服务器

思路分析:

  1. 从第一个开始判断,依次将直连的服务器加进来
  2. 从1找到的集合中依次将直连的服务器加进来,直到集合没有变化
  3. 获取1集合中不存在的服务器,重复以上步骤
  4. 上述集合的个数,就是需要发出广播的服务器数量

参考代码

Java代码实现:

import java.util.*;public class ServiceBroadcast {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {String[] str = in.nextLine().split(" ");List<Integer> list = new ArrayList<>();for (int i = 0; i < str.length; i++) {  // 把第一行加入listlist.add(Integer.parseInt(str[i]));}for (int i = 0; i < str.length - 1; i++) {  // 把剩下的行都加入listString[] s = in.nextLine().split(" ");for (int j = 0; j < s.length; j++) {list.add(Integer.parseInt(s[j]));}}int N = str.length;List<List<Integer>> res = new ArrayList<>(); // 存储需要广播的服务器for (int i = 0; i < N; i++) {  // 每一行if (isContainer(res, i)) {  // 判断某个服务器是否已经存在其连通的服务器集合中continue;}List<Integer> newList = new ArrayList<>();newList.add(i);int lastLength = 0;while (lastLength != newList.size()) { // 判断当前集合可以联通的服务器for (int k = 0; k < newList.size(); k++) {int x = newList.get(k);for (int j = 0; j < N; j++) {int index = x * (N) + j;  // 找到在对应list的索引if (list.get(index).equals(1)) {if (!newList.contains(j)) {newList.add(j);}}}}lastLength = newList.size();}res.add(newList);}System.out.println(res.size());}}public static Boolean isContainer(List<List<Integer>> res, int x) {for (List<Integer> integers : res) {if (integers.contains(x)) {return true;}}return false;}
}

dfs:

参考下面评论区的回溯dfs代码:

import java.util.*;public class ServiceBroadcast_dfs {public static int count = 0;public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] str = in.nextLine().split(" ");int n = str.length;int[][] arr = new int[n][n];for(int i = 0; i < n; i++) {  // 把第一行加入arrarr[0][i] = Integer.parseInt(str[i]);}for(int i = 1; i < n; i++) {  // 把剩下的行加入arrString[] s = in.nextLine().split(" ");for(int j = 0; j < n; j++) {arr[i][j] = Integer.parseInt(s[j]);}}boolean[] visited = new boolean[n];for(int i = 0; i < n; i++) {if(!visited[i]) {dfs(arr, visited, i);}}System.out.println(count);}public static void dfs(int[][] arr, boolean[] visited, int index) {visited[index] = true;boolean flag = true;for (int i = index + 1; i < arr.length; i++) {if (arr[index][i] == 1) {flag = false;dfs(arr, visited, i);}}if (flag) {count++;}}
}

并查集

套用并查集的模板,输出并查集的个数即可。

import java.util.Scanner;public class ServiceBroadcast_union {public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] str = in.nextLine().split(" ");int n = str.length;int[][] arr = new int[n][n];for(int i = 0; i < n; i++) {  // 把第一行加入arrarr[0][i] = Integer.parseInt(str[i]);}for(int i = 1; i < n; i++) {  // 把剩下的行加入arrString[] s = in.nextLine().split(" ");for(int j = 0; j < n; j++) {arr[i][j] = Integer.parseInt(s[j]);}}UF uf = new UF(n);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (arr[i][j] == 1) {  // 如果距离为1,就合并到一块uf.union(i, j);}}}System.out.println(uf.getCount());}
}
class UF {  // 并查集模板,可直接复制使用int count;   //连通分量个数int[] id;int[] sz;public UF(int n) {count = n;id = new int[n];sz = new int[n];for (int i = 0; i < n; i++) {id[i] = i;sz[i] = 1;}}public int getCount() {return count;}public int find(int p) {if (p != id[p]) {id[p] = find(id[p]);}return id[p];}public boolean union(int p, int q) {int pRoot = find(p);int qRoot = find(q);if (pRoot == qRoot) {return  false;}if (sz[pRoot] > sz[qRoot]) {id[qRoot] = pRoot;sz[pRoot] += sz[qRoot];} else {id[pRoot] = qRoot;sz[qRoot] += sz[pRoot];}count--;return true;}
}

并查集类问题可参考:【Leetcode】并查集(Union-Find)算法。

华为机试:服务器广播相关推荐

  1. 华为机试真题分类汇总

    1. 字符串 类别 题目 知识点 题目分值 / 难度 字符串 [华为机试真题 JAVA]TLV解析Ⅰ-100 字符串分隔.拼接.搜索 100/中等 字符串 [华为机试真题 JAVA]寻找相同子串-10 ...

  2. 【华为机试真题Java】从入门到入职-真题列表导读

    写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...

  3. 华为机试 经验(血泪史啊)

    参加华为机试,第一道题竟然没有做完. 原题如下: 免单统计  题目描述  某商城举办了一个促销活动,如果某顾客是某一秒内第一个下单的顾客(可能是多个人),则可以 获取免单.请你编程计算有多少顾客可以获 ...

  4. 华为机试2022.4.13:硬件资源分配

    第一题:老样子,题目臭长,分数最少. 硬件资源分配 题目描述 有M台服务器,每台服务器有以下属性:编号.CPU核数(1~100).内存.CPU架构(0~8).是否支持NP加速的标识(0,1).然后有一 ...

  5. [华为机试]某公司研发了一款高性能AI处理器

    [华为机试]某公司研发了一款高性能AI处理器 题目描述 某公司研发了一款高性能AI处理器.每台物理设备具备8颗AI处理器,编号分别为0.1.2.3.4.5.6.7. 编号0-3的处理器处于同一个链路中 ...

  6. [华为机试真题][2014]62.去除重复字符并排序

    题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...

  7. 牛客网--华为机试在线训练10:字符个数统计

    牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...

  8. 牛客网–华为机试在线训练9:提取不重复的数

    牛客网–华为机试在线训练9:提取不重复的数 题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺 ...

  9. 牛客网–华为机试在线训练8:合并表记录

    牛客网–华为机试在线训练8:合并表记录 题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个 ...

  10. 牛客网–华为机试在线训练7:取近似值

    牛客网–华为机试在线训练7:取近似值 题目描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值.如果小数点后数值大于等于5,向上取整:小于5,则向下取整. 输入描述: 输入一个正浮点数值 输 ...

最新文章

  1. LVM 逻辑卷的扩容/缩容
  2. JavaBean中DAO设计模式介绍
  3. python编程语言好学吗-转行零基础该如何学习python?很庆幸,三年前的我选对了...
  4. 基于网络抓包实现kubernetes中微服务的应用级监控
  5. (转)Virtual PC 2007虚拟网络设置
  6. 企业信息管理- 近期功能改善(3)
  7. C#类的一些简单比较
  8. Java 蓝桥杯 常用核心类
  9. php算法和数据结构
  10. 咱也写个小写数字转大写金额 ,纯粹字符串操作实现
  11. mysql中XtraBackup备份工作机制
  12. css3 修改checkbox disabled颜色_HTML5 + CSS3 gt;gt;gt; 009
  13. 分享咖啡基础知识——从咖啡小白到咖啡发烧友需要了解的那些事儿!
  14. 【Sutcliffe Pentagons】奇幻派的漂流
  15. 电子书chm转换html,chm转换为html的超简单方法
  16. PLINK-GWAS学习6------数据质控之杂合率质控
  17. Python的特殊属性和用法
  18. 为什么说微博、微信、贴吧、头条们都在做同一件事?
  19. 【软考 系统架构设计师】计算机组成与体系结构⑥ 流水线
  20. Unity3D+WebGL数据交互、传参

热门文章

  1. ssm整合之底层搭建
  2. 使用 Mitmdump 与 Python 脚本进行密码嗅探
  3. Tableau技巧(四)排名及组内排名
  4. Spring概念、类注解和Bean作用域
  5. 特斯拉向监管机构承认FSD只是L2,激光雷达或是最大硬伤
  6. 软工第三次作业——结对编程之最长单词链
  7. 3D游戏建模行业真的是传说中的一入职就能领“高薪”吗?
  8. RuntimeError: 1only batches of spatial targets supported (non-empty 3D tensors) but got targets of s
  9. 3030 遇见 2020
  10. 根据先序遍历的结果创建一棵树【D.S】