无向图的路径判断
题目描述
现有一个由1,2,3,4...,n个点,m条边组成的无向图。请判断给定的t组数据x, y(x表示起点,y表示终点),针对每组数据是否存在一条通路,如果存在则输出Yes,否则输出No
输入
第1行:n m t (n、m、t使用空格隔开,其中n表示结点的数量,结点由1开始编号;m表示边的数量;t表示待判断的起点、终点有多少对。2<=n、m、t<=10002<=n、m、t<=1000)
接下来的m行,每行一对整数a b,a、b使用空格隔开,表示结点a与结点b之间存在一条边
接下来的t行,每行一对整数x y, x、y使用空格隔开,如果结点x与结点y之间存在一条通路则输出Yes,否则输出No;每行一个。
输出
如果指定的起点与终点之间存在一条通路则输出Yes,否则输出No,每行一个
样例输入
5 3 4
1 2
3 4
1 4
2 3
2 4
3 5
2 5
样例输出
Yes
Yes
No
No
思路
这道题BFS和DFS都可以解答,DFS更为简单,但可能TLE,BFS更为快速,也比较好理解。
这道题不需要设置sx,sy方位值,只需要一个队列即可做到,
for (int i = 0; i < edge[u].size(); i++) {
int to = edge[u][i];
if (vis[to] == 0) {
vis[to] = 1;
que.push(to);
}
}
edge在上方定义为vector
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> edge[1005];
int n, m, t;
queue<int> que;
int vis[1005], mp[1005][1005];
void bfs(int st)
{
memset(vis, 0, sizeof(vis));
que.push(st);
vis[st] = 1;
while (que.size()) {
int u = que.front();
que.pop();
mp[st][u] = mp[u][st] = 1;
for (int i = 0; i < edge[u].size(); i++) {
int to = edge[u][i];
if (vis[to] == 0) {
vis[to] = 1;
que.push(to);
}
}
}
return;
}
int main()
{
cin >> n >> m >> t;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
edge[u].push_back(v);
edge[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
bfs(i);
}
for (int i = 1; i <= t; i++) {
int u, v;
cin >> u >> v;
if (mp[u][v] == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
小编蒟蒻一个,有什么问题请大佬不惜赐教Orz