如果我只是不访问 queue_front 节点的子节点而只是将它们推入队列怎么办?还会是BFS吗?
What if I just dont visit the children of the queue_front node but just push them into the queue? Will it still be BFS?
https://www.hackerrank.com/challenges/ctci-bfs-shortest-reach/problem
在这个问题中,我通过(第一种方法)访问 queue_front 节点并将其子节点推入队列而不访问其子节点而不是(第二种方法)访问其所有子节点然后将它们推入队列来尝试 BFS队列。
在第一种方法中,测试用例失败了,但在第二种方法中,它通过了。但在这两种情况下,我都使用 BFS。那为什么会失败呢。代码是 below.In 此代码优先方法已启用,它在上述 hackerrank 问题中使某些测试用例失败。第二种方法通过所有测试用例。请查看 bfs 函数。我正在使用邻接表来实现图形。请帮忙!!谢谢!
#include<bits/stdc++.h>
using namespace std;
vector<long> bfs(vector<vector<int>> &graph, int s,int n){
queue<pair<int,long> > st;
vector<bool> vis(n+1,0);
st.push(make_pair(s,0));
vector<long> cost(n+1,-1);
cost[s] = 0;
vis[s] = 1;
while(!st.empty()){
pair<int,long> node = st.front();
st.pop();
//I am visiting the queue_front element, enabling first approach
vis[node.first] = 1;
cost[node.first] = node.second;
for(long i = 0;i<graph[node.first].size();i++){
if(!vis[graph[node.first][i]])
{
st.push(make_pair(graph[node.first][i],long(node.second)+long(6)));
//Below 2 lines are commented to disable the second approach
//cost[graph[node.first][i]] = node.second + 6;
//vis[graph[node.first][i]] = 1;
}
}
}
return cost;
}
int main(){
int q;
cin>>q;
while(q--){
int n,m;
cin>>n>>m;
vector<vector<int>> graph(n+1);
for(long i = 0;i<m;i++){
int u,v;
cin>>u>>v;
graph[u].push_back(v);
graph[v].push_back(u);
}
int s;
cin>>s;
vector<long> cost(n+1,-1);
cost = bfs(graph,s,n);
cost.erase(cost.begin());
cost.erase(cost.begin()+s-1);
for(long i = 0;i<cost.size();i++){
cout<<long(cost[i])<<" ";
}
cout<<endl;
}
}
当你将它们从队列中弹出时访问节点将与 dfs 相同它不会确保你最短path.if你将访问节点然后将其推入队列它会给你最短路径考虑案例:
节点1以循环形式连接到节点2和节点2与节点3以及节点3与节点1
我们将使用队列> q;
pair 的第一个元素是节点,第二个元素是从开始到节点的距离。
案例一:
这是一个循环图,起始节点为 1 我们想找到从 1 到 3.we 的最小距离 push 1 into queue.we 将弹出它并将节点 2 和 3 推入队列而不访问 it.when 我们将弹出 2 然后我们访问 2 并推送 3 所以当我们弹出 3 我们将检查它弹出的节点是否等于 3 并且我们存储最小值 distance.so 在这种情况下我们的最小距离是 2.which 我们已经使用深度遍历找到了。
但答案应该是1,因为1和3直接相关
case 2:we 将在将节点推入队列之前访问该节点
开始节点是 1 然后推入 it.visit 2 和 3 然后将两者推入 stack.when 我们将弹出节点 2 我们检查相邻元素并且 3 和 2 都是 visited.so我们将弹出 3 并检查它是否是目标 node.so 我们将存储 distance.so 在这种情况下 dist[1] 到 dist[3]=0+1 即 1.
https://www.hackerrank.com/challenges/ctci-bfs-shortest-reach/problem 在这个问题中,我通过(第一种方法)访问 queue_front 节点并将其子节点推入队列而不访问其子节点而不是(第二种方法)访问其所有子节点然后将它们推入队列来尝试 BFS队列。 在第一种方法中,测试用例失败了,但在第二种方法中,它通过了。但在这两种情况下,我都使用 BFS。那为什么会失败呢。代码是 below.In 此代码优先方法已启用,它在上述 hackerrank 问题中使某些测试用例失败。第二种方法通过所有测试用例。请查看 bfs 函数。我正在使用邻接表来实现图形。请帮忙!!谢谢!
#include<bits/stdc++.h>
using namespace std;
vector<long> bfs(vector<vector<int>> &graph, int s,int n){
queue<pair<int,long> > st;
vector<bool> vis(n+1,0);
st.push(make_pair(s,0));
vector<long> cost(n+1,-1);
cost[s] = 0;
vis[s] = 1;
while(!st.empty()){
pair<int,long> node = st.front();
st.pop();
//I am visiting the queue_front element, enabling first approach
vis[node.first] = 1;
cost[node.first] = node.second;
for(long i = 0;i<graph[node.first].size();i++){
if(!vis[graph[node.first][i]])
{
st.push(make_pair(graph[node.first][i],long(node.second)+long(6)));
//Below 2 lines are commented to disable the second approach
//cost[graph[node.first][i]] = node.second + 6;
//vis[graph[node.first][i]] = 1;
}
}
}
return cost;
}
int main(){
int q;
cin>>q;
while(q--){
int n,m;
cin>>n>>m;
vector<vector<int>> graph(n+1);
for(long i = 0;i<m;i++){
int u,v;
cin>>u>>v;
graph[u].push_back(v);
graph[v].push_back(u);
}
int s;
cin>>s;
vector<long> cost(n+1,-1);
cost = bfs(graph,s,n);
cost.erase(cost.begin());
cost.erase(cost.begin()+s-1);
for(long i = 0;i<cost.size();i++){
cout<<long(cost[i])<<" ";
}
cout<<endl;
}
}
当你将它们从队列中弹出时访问节点将与 dfs 相同它不会确保你最短path.if你将访问节点然后将其推入队列它会给你最短路径考虑案例:
节点1以循环形式连接到节点2和节点2与节点3以及节点3与节点1
我们将使用队列
案例一: 这是一个循环图,起始节点为 1 我们想找到从 1 到 3.we 的最小距离 push 1 into queue.we 将弹出它并将节点 2 和 3 推入队列而不访问 it.when 我们将弹出 2 然后我们访问 2 并推送 3 所以当我们弹出 3 我们将检查它弹出的节点是否等于 3 并且我们存储最小值 distance.so 在这种情况下我们的最小距离是 2.which 我们已经使用深度遍历找到了。
但答案应该是1,因为1和3直接相关
case 2:we 将在将节点推入队列之前访问该节点
开始节点是 1 然后推入 it.visit 2 和 3 然后将两者推入 stack.when 我们将弹出节点 2 我们检查相邻元素并且 3 和 2 都是 visited.so我们将弹出 3 并检查它是否是目标 node.so 我们将存储 distance.so 在这种情况下 dist[1] 到 dist[3]=0+1 即 1.