gpt4 book ai didi

c++ - 在 C++ 中使用 BFS 获取 2 个顶点之间的路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:11 24 4
gpt4 key购买 nike

我已经为此编写了代码,但它给出了断开连接图的段错误。它适用于连接的图形。我该如何克服这个错误?

vector<int> getPathBFS(int V, int** edges,int v1, int v2, int* visited, unordered_map<int,int> t)
{
queue<int> q;
q.push(v1);
visited[v1]=1;
int done=0;
while(!q.empty() && done==0)
{
for(int i=0;i<V;i++)
{
int front=q.front();
q.pop();
if(edges[front][i]==1 && visited[i]!=1)
{
q.push(i);
t[i]=front;
visited[i]=1;
if(i==v2)
{
done=1;
break;
}
}
}
}
vector<int> a;
if(done==0)
return a;
else
{
int k=v2;
a.push_back(v2);
while(k!=v1)
{
k=t[k];
a.push_back(k);
}
return a;
}
}

int main()
{
int V, E;
cin >> V >> E;
int** edges=new int*[V];
for(int i=0;i<V;i++)
{
edges[i]=new int[V];
for(int j=0;j<V;j++)
{
edges[i][j]=0;
}
}

for(int i=0;i<E;i++)
{
int f,s;
cin>>f>>s;
edges[f][s]=1;
edges[s][f]=1;
}
int v1,v2;
cin>>v1>>v2;

int* visited=new int[V];
for(int i=0;i<V;i++)
visited[i]=0;
unordered_map<int,int> t;
t[v2]=0;
vector<int> ans=getPathBFS(V,edges,v1,v2,visited,t);
for(int i=0;i<ans.size();i++ && !ans.empty())
{
cout<<ans[i]<<" ";
}

delete [] visited;
for(int i=0;i<V;i++)
{
delete [] edges[i];
}

delete [] edges;

return 0;
}

我试运行了代码。它将首先创建邻接矩阵边并标记其中的所有边。 Visited 数组用于跟踪到目前为止已经访问过的所有顶点,因此不会出现无限循环。对于下面给出的测试用例,它会工作直到队列包含 1,然后它会弹出 1 并且循环将结束,因为没有剩余的边连接到 1 并且未被访问。在此之后,while 循环应该理想地中断并且 done==0 它应该返回一个空 vector 。我不明白为什么会出现段错误。

map 用于跟踪哪个顶点被哪个顶点放入队列。

不适用于测试用例:

6 3
5 3
0 1
3 4
0 3

下面是上述测试用例的图形图像: enter image description here

这里我们需要找到从顶点 0 到 3 的路径。输入格式为:图中的顶点数,边数

顶点之间的边(对于 E 线),

我们需要找到路径的顶点。

最佳答案

您错误地弹出了 BFS 队列。您应该在外循环中弹出队列,而不是为队列中的每个条目执行 |V| 次的内部 for 循环,它为队列中的每个元素执行一次。

vector<int> getPathBFS(int V, int** edges,int v1, int v2, int* visited, unordered_map<int,int> t)
{
queue<int> q;
q.push(v1);
visited[v1]=1;
int done=0;
while(!q.empty() && done==0)
{
int front=q.front();
q.pop();

for(int i=0;i<V;i++)
{
if(edges[front][i]==1 && visited[i]!=1)
{
q.push(i);
t[i]=front;
visited[i]=1;
if(i==v2)
{
done=1;
break;
}
}
}
}
vector<int> a;
if(done==0)
return a;
else
{
int k=v2;
a.push_back(v2);
while(k!=v1)
{
k=t[k];
a.push_back(k);
}
return a;
}
}

此外,在代码的 main 函数中,打印答案的 for 循环中有一个冗余表达式 !ans.empty() .

关于c++ - 在 C++ 中使用 BFS 获取 2 个顶点之间的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com