cin>>t;
while (t--)
{
cin>>n;
cin>>m;
if (n==m)
cout<<"0\n";
else
{
//Breadth First Search Tree:
queue <gnode*> gqueue;
bft_data bft=bft_data();
list<gnode>* gp;
list<gnode>::iterator it;
gp=_gfind(graph,n);// finds list containing gnode with n value
gnode* st=gfind(gp,n),*tmp,*_st;//finds gnode with n value
_st=st;
bft.w[st->v]=0;
bft.pn[st->v]=NULL;
bft.c[st->v]=1;
gqueue.push(st);
while (!gqueue.empty())
{
st=gqueue.front();
gqueue.pop();
gp=_gfind(graph,st->v);
it=(*gp).begin();
for (++it;it!=(*gp).end();it++)//initialized with ++it to skip fist element of list
{
tmp=&(*it);
// cout<<tmp->v<<"\n";
// getchar();
if (bft.c[tmp->v]==0)
{
bft.pn[tmp->v]=st;
bft.c[tmp->v]=1;
bft.w[tmp->v]=bft.w[st->v]+1;
gqueue.push(tmp);
}
}
}
if(bft.w[m]!=SIZE)
cout<<bft.w[m]<<"\n";
else
cout<<"Impossible\n";
bft.~bft_data();
}
}
这个代码片段通过构造bfs树来计算具有值n和m的节点的距离b / w。但是在外部while循环的第一次迭代中构造的bft树保留了它的值,while循环的进一步迭代对它没有影响bft
此处图表的类型为vector<list<gnode>>
bfs是类bft_data的对象:
class bft_data
{
public:
int w[SIZE],c[SIZE];
gnode* pn[SIZE];
bft_data()
{
memset(w,SIZE,SIZE);
memset(c,0,SIZE);
memset(pn,NULL,SIZE);
}
};
答案 0 :(得分:1)
我没有查看你的第一个代码提取,但第二个提取可能解释了这个问题:memset的第三个参数是字节数,所以你必须将它乘以数组元素的大小:
memset(w,SIZE,SIZE * sizeof(int));
memset(c,0,SIZE * sizeof(int));
memset(pn,NULL,SIZE * sizeof (gnode*));