【正经题解】小明检修线路
2024-03-15 11:09:04
发布于:浙江
14阅读
0回复
0点赞
这道题的思路是使用深度优先搜索( )来遍历检修点之间的相通关系,判断某个检修点是否能够通过 次数据包传递回到自身。
使用邻接表 _ 表示检修点之间的相通关系,其中 _ [ ] 存储了与检修点 相通的其他检修点。
对于每个检修点 (从 到 ),进行深度优先搜索( ),检查是否存在一条路径使得数据包在经过 次传 递后能返回到 。
在 中,通过设置 数组来记录检修点是否被访问过,同时使用全局变量 _ 来标记是否找到了符合条件的路径。
如果找到了一条路径使得数据包在经过 次传递后能返回到 ,输出 " ";否则,输出 " "。
通过对每个检修点都进行上述判断,即可得到所有检修点的答案。
这种解法利用 的递归性质,从每个检修点开始深度优先搜索,判断是否存在符合条件的路径。
#include<bits/stdc++.h>
using namespace std;
vector<int> adj_list[1005]; // 邻接表表示相通关系
int n, m, current_checkpoint, is_reachable;
int visited[1005]; // 记录检修点是否被访问过
// 深度优先搜索函数,判断检修点i是否能经过n次数据包传递
void dfs(int node) {
visited[node] = 1; // 标记为已访问
for (auto neighbor : adj_list[node]) {
if (neighbor == current_checkpoint) {
is_reachable = 1; // 找到一条路径使得数据包在经过n次传递后能返回到i
break;
}
if (!visited[neighbor]) {
dfs(neighbor);
}
}
}
int main() {
cin >> n >> m;
while (m--) {
int x, y;
cin >> x >> y;
adj_list[x].push_back(y); // 读入相通关系
}
for (int i = 1; i <= n; i++) {
memset(visited, 0, sizeof(visited)); // 初始化visited数组
current_checkpoint = i;
is_reachable = 0;
dfs(i);
if (is_reachable) {
cout << "T\n";
} else {
cout << "F\n";
}
}
return 0;
}
这里空空如也
有帮助,赞一个