通信系统可达性判断

某市计划建设一个通信系统。按照规划,这个系统包含若干端点,这些端点由通信线缆链接。消息可以在任何一个端点产生,并且只能通过线缆传送。每个端点接收消息后会将消息传送到与其相连的端点,除了那个消息发送过来的端点。如果某个端点是产生消息的端点,那么消息将被传送到与其相连的每一个端点。

为了提高传送效率和节约资源,要求当消息在某个端点生成后,其余各个端点均能接收到消息,并且每个端点均不会重复收到消息。

现给你通信系统的描述,你能判断此系统是否符合以上要求吗?

输入描述

输入包含多组测试数据。每两组输入数据之间由空行分隔。

每组输入首先包含2个整数N和M,N (1<=N<=1000) 表示端点个数,M (0<=M<=N*(N-1)/2) 表示通信线路个数。

接下来M行每行输入2个整数A和B (1<=A,B<=N),表示端点A和B由一条通信线缆相连。两个端点之间至多由一条线缆直接相连,并且没有将某个端点与其自己相连的线缆。

当N和M都为0时,输入结束。

输出描述

对于每组输入,如果所给的系统描述符合题目要求,则输出Yes,否则输出No。

解题思路:

  1. 首先,判断输入是否结束,即判断N和M是否都为0,如果是,则结束程序;
  2. 对于每组输入,首先创建一个邻接矩阵'adj[][]',用于表示每两个端点之间是否有通信线缆相连;
  3. 遍历所有端点,对于每个端点'i',进行广度优先搜索 (BFS),判断从端点'i'出发能否遍历到所有其他端点;
  4. 在BFS过程中,使用一个'visited'数组记录已经访问过的端点,初始化为'false';
  5. 对于每个端点'i',将'visited[i]'置为'true',并将'i'加入到一个队列中;
  6. 当队列不为空时,取出队首端点'j',并遍历与端点'j'相连的所有端点'k';
    • 如果端点'k'还未被访问过,则将'visited[k]'置为'true',并将'k'加入到队列中;
  7. 遍历完所有相连端点后,如果'visited'数组中仍有'false'值,说明存在无法遍历到的端点,输出'No';
  8. 如果'visited'数组中所有值均为'true',则说明从端点'i'出发可以遍历到所有其他端点,输出'Yes';
  9. 继续下一组输入,重复步骤1。

具体实现见下方代码:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAXN = 1005;

int main() {
    int N, M;
    while (cin >> N >> M && (N != 0 || M != 0)) {
        vector<vector<bool>> adj(N + 1, vector<bool>(N + 1, false));
        for (int i = 0; i < M; i++) {
            int A, B;
            cin >> A >> B;
            adj[A][B] = adj[B][A] = true;
        }

        bool is_possible = false;
        for (int i = 1; i <= N; i++) {
            vector<bool> visited(N + 1, false);
            queue<int> q;
            visited[i] = true;
            q.push(i);

            while (!q.empty()) {
                int j = q.front();
                q.pop();

                for (int k = 1; k <= N; k++) {
                    if (adj[j][k] && !visited[k]) {
                        visited[k] = true;
                        q.push(k);
                    }
                }
            }

            bool all_visited = true;
            for (int k = 1; k <= N; k++) {
                if (!visited[k]) {
                    all_visited = false;
                    break;
                }
            }

            if (all_visited) {
                is_possible = true;
                break;
            }
        }

        if (is_possible) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }

    return 0;
}
通信系统可达性判断

原文地址: https://www.cveoy.top/t/topic/qyiQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录