2123:图的存储与访问
这是最近的一道新题,看没什么题解,那我就来写一篇叭…
1.先把输入输出都一股脑写进去,然后连边,注意啦!这是有向图,所以只有从 Ui 到 Vi 这么一个方向哦!
2.写个 bfs,调用 b f s ( i ) bfs(i) bfs(i) 预处理从 i i i 出发的可达节点,我们看一下这个 bfs 是如何实现的:
- 初始化队列 q q q,并将起始节点 s t st st 入队。
- 标记 o k s t s t ok_{st st} okstst 为 1 1 1,因为每个节点可以到达自身喵!
- 当队列不空时,取出队首节点 u u u,遍历其所有邻接节点 v v v。
- 如果 v v v 还没被标记为从 s t st st 可达,就标记并加入队列,接着继续搜索。
3.读入 q q q 次询问的 x x x 和 y y y,当 o k x y ok_{xy} okxy 为 1 1 1,输出 Yes
,否则输出 No
哦!
上个代码喵…
#include<bits/stdc++.h>
using namespace std;
vector<int> lb[1005];//连边。
bool ok[1005][1005];//用来表示从 x 是否可以到达 y。
int n, m, k, u, v, x, y;
void bfs(int st) {queue<int> q;q.push(st);ok[st][st]=1;while(!q.empty()) {int u=q.front();q.pop();for(int v:lb[u]) if(!ok[st][v]) {ok[st][v]=1;q.push(v);}}
}
int main() {cin>> n>> m>> k;for(int i=1;i<=m;i++) {cin>> u>> v;lb[u].push_back(v);}for(int i=1;i<=n;i++) bfs(i);while(k--){cin>> x>> y;if(ok[x][y]) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}