【正经题解】有向无权图2
2024-03-18 14:42:52
发布于:浙江
46阅读
0回复
0点赞
创建一个图,使用邻接表的形式表示。对于每个节点,将其可以直接到达的节点记录在邻接表中。
使用一个队列进行 。从起始节点 开始,将 加入队列,并标记为已访问。
在 过程中,不断从队列中取出节点,访问其未访问过的相邻节点,将其加入队列,并标记为已访问。
如果在 过程中找到目标节点 ,返回 ,表示存在从 到 的路径;否则,返回 ,表示不存在这样的 路径。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, a, b, x, y;
vector<int> v[N];
int vis[N];
// 使用BFS判断是否能从a点到达b点
bool bfs() {
queue<int> q;
vis[a] = 1;
q.push(a);
while (!q.empty()) {
int t = q.front();
q.pop();
// 如果当前点为目标点b,返回true
if (t == b) return true;
// 遍历当前点的所有相邻点
for (int i = 0; i < v[t].size(); i++) {
int tt = v[t][i];
if (!vis[tt]) {
vis[tt] = 1;
q.push(tt);
}
}
}
return false;
}
int main() {
cin >> n >> m >> a >> b;
// 构建有向图
for (int i = 1; i <= m; i++) {
cin >> x >> y;
v[x].push_back(y);
}
// 判断是否能从a点到达b点
if (bfs()) {
cout << "Yes";
} else {
cout << "No";
}
return 0;
}
这里空空如也
有帮助,赞一个