跟普通BFS的区别是:双向BFS用两个队列,让起点和终点各进一队;
1,创建两个队列,一个起点进队,一个终点进队
2,将两个对头的可到达节点分别入队
3,两个头节点出队
4,循环2,3如果起点队列的头节点在另一个队里进入过了,就停止
或是等到有一个队为空
#include <bits/stdc++.h>
using namespace std;
string begin = "A";
string end = "G";
void BFS(map<string,set<string>> m)
{
set<string> check1;
set<string> check2;
deque<string> d1;
deque<string> d2;
check1.insert(::begin);
check2.insert(::end);
d1.push_back(::begin);
d2.push_back(::end);
while(!d1.empty() && !d2.empty())
{
string x = d1.front();
string y = d2.front();
if(check1.find(y) != check1.end() || check2.find(x) != check2.end()) break;
for(auto elem1 : m[x])
{
if(check1.find(elem1) == check1.end())
{
d1.push_back(elem1);
check1.insert(elem1);
}
}
for(auto elem2 : m[y])
{
if(check2.find(elem2) == check2.end())
{
d2.push_back(elem2);
check2.insert(elem2);
}
}
d1.pop_front();
d2.pop_front();
}
return;
}
int main()
{
map<string,set<string>> m;
for(int i = 0;i < 10;++i)
{
string x,y;
cin >> x >> y;
m[x].insert(y);
m[y].insert(x);
}
BFS(m);
return 0;
}
/*
A B
A D
A E
B D
D E
B C
E C
E F
E G
F G
*/