// bfs.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//图邻接表的广度优先遍历
//图邻接矩阵的广度优先遍历
#include <iostream>
#include<vector>
#include<queue>
#include<list>
using namespace std;
//函数输入:遍历起始顶点,顶点序号为0~n-1,顶点数与邻接表大小有关,邻接表,访问数组
void bfs(int num, vector<list<int>> &arr, vector<int>&visited)
{
queue<int>q;
visited[num] = 1;
cout << num << ' ';
q.push(num);
list<int>::iterator iter;
while (!q.empty())
{
int temp = q.front();
q.pop();
iter = arr[temp].begin();
for (; iter != arr[temp].end(); iter++)
{
if (visited[*iter]) continue;
q.push(*iter);
visited[*iter] = 1;
cout << *iter << ' ';
}
}
cout << endl;
}
//函数输入:邻接矩阵,访问标识数组
int bfsMatrix(vector<vector<int>>&isconnected, vector<int>&visited)
{
int n = isconnected.size();
int circle = 0;
queue<int>q;
for (int i = 0; i < n; i++)//给出遍历起点
{
if (visited[i]) continue;
cout << i << ' ';
q.push(i);
visited[i] = 1;
while (!q.empty())
{
int v = q.front();
q.pop();
for (int j = 0; j < n; j++)//遍历与起点相关联的所有顶点
{
if (!visited[j] && isconnected[v][j])
{
q.push(j);
cout << j << ' ';
visited[j] = 1;
}
}
}
circle++;
}
cout << endl;
return circle;
}
int main()
{
//邻接表
/*vector<list<int>>v;
list<int>l1 = { 1,2,3 };
v.push_back(l1);
list<int>l2 = { 0,4};
v.push_back(l2);
list<int>l3 = { 0,4,5 };
v.push_back(l3);
list<int>l4 = { 0 };
v.push_back(l4);
list<int>l5 = { 1,2};
v.push_back(l5);
list<int>l6 = { 2 };
v.push_back(l6);
int n = v.size();
vector<int>visited(n);
//输入第一个参数范围是0~n-1
bfs(5, v, visited);*/
//邻接矩阵
int n,m;
cin >> n>>m;//有n个顶点m条边
vector<vector<int>>vv(n,vector<int>(n));
vector<int>visited(n);
// cout << vv.size() << endl;
int i, j;
int k = m;
for (; k > 0; k--)
{
cin >> i >> j;
vv[i][j] = 1;
vv[j][i] = 1;
}
cout << i << ',' << j << endl;
for (int ii = 0; ii < n; ii++)
{
for (int jj = 0; jj < n; jj++)
{
cout << vv[ii][jj] << ' ';
}
cout << endl;
}
int circle = bfsMatrix(vv, visited);
cout << circle << endl;
system("pause");
return 0;
}
/*
邻接矩阵测试用例1
6 6
0 1
0 2
0 3
1 4
2 4
2 5
结果输出:012345 circle=1
测试用例2
6 3
0 3
0 4
4 5
结果输出:034512 circle = 3
*/
总结:图的bfs都要使用队列辅助
邻接表遍历还需要迭代器用于遍历列表