广度优先搜索
题目描述:请编写程序,用广度优先搜索输出给定无向图中的各个连通分量。
注意输出顺序规定如下:
每个连通分量的输出从其中编号最小的顶点开始;
不同连通分量按其第一个顶点的编号增序输出,每个连通分量占一行;
当一个顶点有多个邻接点时,按其输入的逆序进行访问,即最后输入的邻接点,在广度优先搜索中应被最先访问输出。
输入格式:
输入首先在第一行给出图中最大顶点数量,即正整数 kMaxVertex(≤10)。
第二行给出两个正整数,依次为当前要创建的图的顶点数 n 和边数 m(保证顶点数至少为 2 且不超过最大顶点数量)。
第三行给出 n 个英文字母,顺序对应每个顶点的信息。
随后 m 行,每行给出一条无向边的两个端点的编号、以及边的权重。顶点编号从 0 开始,权重(≤2
30
)为整数。
同行数字、字符均以一个空格分隔。
输出格式:
按照题面中规定的顺序,输出图中的连通分量每个顶点的信息。每个连通分量占一行,字符间不要有空格。
输入样例:
10
6 7
a b c d e f
2 0 2
2 3 1
3 0 3
3 4 4
2 4 2
4 0 5
4 5 1
输出样例:
aedcf
b
解题代码示例:
include
include
include
include
define INF 0x3f3f3f3f
define N 11
using namespace std;
int n, m;
char a[10];
int g[N][N];
bool str[N];
queue
vector<vector
vector<vector
{
memset(str, false, sizeof(str));
for (int i = 0; i < n; i++)
{
if (str[i]) continue; //已经被访问过的节点直接跳过
vector
qu.push(i); //将第一个未被访问的节点推入队列
while (!qu.empty())
{
int cur = qu.front();
if (str[cur])
{
qu.pop();
continue; //如果被访问过了,直接跳过,这是为了避免因重复入队导致的时间增加
}
for (int j = n-1; j >= 0; j--)
{
if (g[cur][j] != INF && !str[j]) //从当前节点到j节点有路径且j节点未被访问过,入队
{
qu.push(j);
}
}
temp.push_back(cur);
str[cur] = true;
qu.pop();
}
v.push_back(temp);
}
return v;
}
int main()
{
int kMaxVertex;
cin >> kMaxVertex;
cin >> n >> m;
memset(g, INF, sizeof(g));
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
g[x][y] = z;
g[y][x] = z;
}
vector<vector
for (int i = 0; i < c.size(); i++)
{
for (int j = 0; j < c[i].size(); j++)
{
cout << a[c[i][j]];
}
cout << endl;
}
return 0;
}
解题思路:
1.并非应用了传统的BFS算法,只是能解决问题而已,在每次开始搜索前用if判断是否已经访问来进行过滤掉重复入队的元素,可能会导致时间增加,不过更好理解
2.返回时利用了二维数组,这个点可以注意一下
浙公网安备 33010602011771号