当前位置:   article > 正文

【华为OD机试B卷】服务器广播、需要广播的服务器数量(C++/Java/Python)

【华为OD机试B卷】服务器广播、需要广播的服务器数量(C++/Java/Python)

题目

题目描述

服务器连接方式包括直接相连,间接连接。

AB直接连接,BC直接连接,则AC间接连接。

直接连接和间接连接都可以发送广播。

给出一个N*N数组,代表N个服务器,

matrix[i][j] == 1
则代表ij直接连接;不等于 1 时,代表ij不直接连接。

matrix[i][i] == 1

即自己和自己直接连接。matrix[i][j] == matrix[j][i]

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

输入

输入为N行,每行有N个数字,为01,由空格分隔,

构成N*N的数组,N的范围为 1 <= N <= 40

输出

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

用例一

输入

  1. 1 0 0
  2. 0 1 0
  3. 0 0 1

输出

3

说明

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

用例二

输入

  1. 1 1
  2. 1 1

输出

1

说明

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

实现代码

C++
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int count = 0;
  5. void dfs(vector<vector<int>>& arr, vector<bool>& visited, int index) {
  6. visited[index] = true;
  7. bool flag = true;
  8. for (int i = index + 1; i < arr.size(); i++) {
  9. if (arr[index][i] == 1) {
  10. flag = false;
  11. dfs(arr, visited, i);
  12. }
  13. }
  14. if (flag) {
  15. count++;
  16. }
  17. }
  18. int main() {
  19. string input;
  20. getline(cin, input);
  21. vector<string> str;
  22. size_t pos = 0;
  23. while ((pos = input.find(" ")) != string::npos) {
  24. str.push_back(input.substr(0, pos));
  25. input.erase(0, pos + 1);
  26. }
  27. str.push_back(input);
  28. int n = str.size();
  29. vector<vector<int>> arr(n, vector<int>(n, 0));
  30. for (int i = 0; i < n; i++) {
  31. arr[0][i] = stoi(str[i]);
  32. }
  33. for (int i = 1; i < n; i++) {
  34. getline(cin, input);
  35. pos = 0;
  36. vector<string> s;
  37. while ((pos = input.find(" ")) != string::npos) {
  38. s.push_back(input.substr(0, pos));
  39. input.erase(0, pos + 1);
  40. }
  41. s.push_back(input);
  42. for (int j = 0; j < n; j++) {
  43. arr[i][j] = stoi(s[j]);
  44. }
  45. }
  46. vector<bool> visited(n, false);
  47. for (int i = 0; i < n; i++) {
  48. if (!visited[i]) {
  49. dfs(arr, visited, i);
  50. }
  51. }
  52. cout << count << endl;
  53. return 0;
  54. }
Java
  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner in = new Scanner(System.in);
  5. String[] str = in.nextLine().split(" ");
  6. int n = str.length;
  7. int[][] arr = new int[n][n];
  8. for(int i = 0; i < n; i++) {
  9. arr[0][i] = Integer.parseInt(str[i]);
  10. }
  11. for(int i = 1; i < n; i++) {
  12. String[] s = in.nextLine().split(" ");
  13. for(int j = 0; j < n; j++) {
  14. arr[i][j] = Integer.parseInt(s[j]);
  15. }
  16. }
  17. int count = 0;
  18. Queue<Integer> queue = new LinkedList<>();
  19. for(int i = 0; i < n; i++) {
  20. if(!queue.contains(i)) {
  21. dfs(arr, queue, i);
  22. count++;
  23. }
  24. }
  25. System.out.println(count);
  26. }
  27. public static void dfs(int[][] arr, Queue<Integer> queue, int index) {
  28. queue.offer(index);
  29. for (int i = index + 1; i < arr.length; i++) {
  30. if (arr[index][i] == 1 && !queue.contains(i)) {
  31. dfs(arr, queue, i);
  32. }
  33. }
  34. }
  35. }
Python
  1. import sys
  2. def dfs(arr, visited, index):
  3. visited[index] = True
  4. flag = True
  5. for i in range(index + 1, len(arr)):
  6. if arr[index][i] == 1:
  7. flag = False
  8. dfs(arr, visited, i)
  9. if flag:
  10. global count
  11. count += 1
  12. count = 0
  13. str = input().split(" ")
  14. n = len(str)
  15. arr = [[0]*n for _ in range(n)]
  16. for i in range(n):
  17. arr[0][i] = int(str[i])
  18. for i in range(1, n):
  19. s = input().split(" ")
  20. for j in range(n):
  21. arr[i][j] = int(s[j])
  22. visited = [False]*n
  23. for i in range(n):
  24. if not visited[i]:
  25. dfs(arr, visited, i)
  26. print(count)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/762917
推荐阅读
相关标签
  

闽ICP备14008679号