写法是bfs , 可能会只有1,2,3,4,5,8六个点通过。
// p1为最小的奇数步数 , p2为偶数步数 , v为邻接表。
void bfs(int rt){
p2[1]=0;
queue<int> q;
for(int y:v[1]){
p1[y] = 1;
q.push(y);
}
while (!q.empty()){
int x = q.front() ; q.pop();
for(int y : v[x]){
if(p1[x] != INF){
if (p2[y] != INF) continue; // 此处不可以使用continue,因为y点可能是偶数走过但是奇数没走过
p2[y]=p1[x]+1;
q.push(y);
// cout<<p2[y]<<endl;
}
if(p2[x] != INF){
if (p1[y] != INF) continue;//这里可以使用continue,因为后面已经没有了。
p1[y]=p2[x]+1;
q.push(y);
// cout<<p[y]<<endl;
}
}
}
}
建议改为:
void bfs(int rt){
p2[1]=0;
queue<int> q;
for(int y:v[1]){
p1[y] = 1;
q.push(y);
}
while (!q.empty()){
int x = q.front() ; q.pop();
for(int y : v[x]){
if(p1[x] != INF){
if (p2[y] == INF){
p2[y]=p1[x]+1;
q.push(y);
}
// cout<<p2[y]<<endl;
}
if(p2[x] != INF){
if (p1[y] == INF){
p1[y]=p2[x]+1;
q.push(y);
}
// cout<<p[y]<<endl;
}
}
}
}