我为此编写了代码,但它给出了断开连接图的分段错误。对于连接的图形,它工作正常。 我该如何克服这个错误?
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 array用于跟踪到目前为止已访问过的所有顶点,因此没有无限循环。 对于下面给出的测试用例,它将一直工作到队列包含1,然后弹出1,并且循环将结束,因为没有剩余的边连接到1且未被访问。在此之后,while循环在理想情况下应该中断,并且当完成== 0时,它应该返回一个空向量。我不明白为什么会出现细分错误。
该地图用于跟踪哪个顶点由哪个顶点放入队列。
不适用于测试用例:
6 3
5 3
0 1
3 4
0 3
在这里,我们需要找到从顶点0到3的路径。 输入格式为: 图中的顶点数,边数
顶点之间的边缘(对于E线),
我们需要找到路径的顶点。
答案 0 :(得分:0)
您错误地弹出了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()
,您可以在其中打印答案。