遍历图的常见形式
1,创建队列,头节点入队
2,将头节点的所有可到达节点入队
3,头节点出队
4,持续循环2,3直到队列为空
注意:不可重复入队,需要一个容器记录是否入队过
代码实例:
存储形式为
map<string,set<string>> m
其中map<节点,set<节点可到达的节点>> m
A B
A D
A E
B D
D E
B C
E C
E F
E G
F G
1,创建队列,头节点入队
set<string> check;
deque<string> d;
check.insert(::begin);
d.push_back(::begin);
2,将头节点的所有可到达节点入队
3,头节点出队
4,持续循环2,3直到队列为空
while(!d.empty())
{
string point = d.front();
for(auto elem : m[point])
{
if(check.find(elem) == check.end())
{
check.insert(elem);
d.push_back(elem);
}
}
d.pop_front();
}
总代码:
#include <bits/stdc++.h>
using namespace std;
string begin = "A";
void BFS(map<string,set<string>> m)
{
set<string> check;
deque<string> d;
check.insert(::begin);
d.push_back(::begin);
while(!d.empty())
{
string point = d.front();
for(auto elem : m[point])
{
if(check.find(elem) == check.end())
{
check.insert(elem);
d.push_back(elem);
}
}
d.pop_front();
}
}
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
*/