通信系统可达性判断
通信系统可达性判断
某市计划建设一个通信系统。按照规划,这个系统包含若干端点,这些端点由通信线缆链接。消息可以在任何一个端点产生,并且只能通过线缆传送。每个端点接收消息后会将消息传送到与其相连的端点,除了那个消息发送过来的端点。如果某个端点是产生消息的端点,那么消息将被传送到与其相连的每一个端点。
为了提高传送效率和节约资源,要求当消息在某个端点生成后,其余各个端点均能接收到消息,并且每个端点均不会重复收到消息。
现给你通信系统的描述,你能判断此系统是否符合以上要求吗?
输入描述
输入包含多组测试数据。每两组输入数据之间由空行分隔。
每组输入首先包含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。
解题思路:
- 首先,判断输入是否结束,即判断N和M是否都为0,如果是,则结束程序;
- 对于每组输入,首先创建一个邻接矩阵'adj[][]',用于表示每两个端点之间是否有通信线缆相连;
- 遍历所有端点,对于每个端点'i',进行广度优先搜索 (BFS),判断从端点'i'出发能否遍历到所有其他端点;
- 在BFS过程中,使用一个'visited'数组记录已经访问过的端点,初始化为'false';
- 对于每个端点'i',将'visited[i]'置为'true',并将'i'加入到一个队列中;
- 当队列不为空时,取出队首端点'j',并遍历与端点'j'相连的所有端点'k';
- 如果端点'k'还未被访问过,则将'visited[k]'置为'true',并将'k'加入到队列中;
- 遍历完所有相连端点后,如果'visited'数组中仍有'false'值,说明存在无法遍历到的端点,输出'No';
- 如果'visited'数组中所有值均为'true',则说明从端点'i'出发可以遍历到所有其他端点,输出'Yes';
- 继续下一组输入,重复步骤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 著作权归作者所有。请勿转载和采集!