这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
读入一个用邻接矩阵存储的无向连通图,输出它的广度(宽度)优先遍历序列。
第一行一个正整数 n(2≤n≤100),表示图中顶点数。
接下来是一个 n×nn×n 的邻接矩阵,a[i][j]=1 表示顶点 i 和顶点 j 之间有直接边相连,a[i][j]=0a 表示没有直接边相连。
保证 i=j时,a[i][j]=0,并且 a[i][j]=a[j][i]。
输出从顶点 1 开始,对该图进行宽度优先遍历得到的顶点序列,每两个数之间用一个 -分隔。
思考:如果不是连通图,比如某个顶点 x 孤立在外,即邻接矩阵中的 a[x][j]=0,a[i][x]=0,该如何处理?

只需要把上一题的DFS改为BFS即可
非常简单
直接上代码了
图的遍历 深度优先遍历(爱思创)_吾乃狙击神蛐的博客-CSDN博客
- queue<int> q;
- void bfs(int x)
- {
- vis[x]=1;
- q.push(x);//入队
- while(!q.empty())//判空
- {
- int cur=q.front();//存储队首
- for(int i=1;i<=n*2;i++)
- {
- if(g[cur][i]==1 && vis[i]==0)
- {
- q.push(i);
- vis[i]=1;//打标记
- }
- }
- if(q.front()!=1) cout<<"-"<
front();//输出答案 - q.pop();//别忘了出队
- }
- cout<
- return ;
- }
完整代码:
- #include
- using namespace std;
- int g[1001][1001],vis[1001];
- int n,m;
- queue<int> q;
- void bfs(int x)
- {
- vis[x]=1;
- q.push(x);
- while(!q.empty())
- {
- int cur=q.front();
- for(int i=1;i<=n*2;i++)
- {
- if(g[cur][i]==1 && vis[i]==0)
- {
- q.push(i);
- vis[i]=1;
- }
- }
- if(q.front()!=1) cout<<"-"<
front(); - q.pop();
- }
- cout<
- return ;
- }
- int main()
- {
- cin>>n;
- int x,y;
- for(int j = 1 ; j <= n ;j++)
- {
- for(int i = 1 ; i <= n ;i++)
- {
- cin>>g[j][i];//模仿上一题输入
- }
- }
- cout<<1;
- bfs(1);
- return 0;
- }
如果BFS不熟可以看我之前的文章
c++二叉树BFS3题解(爱思创)_吾乃狙击神蛐的博客-CSDN博客
AC
-
相关阅读:
UTONMOS:布局的“元宇宙”未来产生哪些影响?
分布式调度器xxl-job
【故事证明和概率公理】
11 传输层协议
Redis入门到实战(四、原理篇)RESP协议
Java构建树结构的公共方法
webpack之hot热更新
Promise从入门到精通(第4章 async 和 await)
k8s高可用集群(一)
高等数学(第七版)同济大学 习题7-1 个人解答
-
原文地址:https://blog.csdn.net/HackerQY/article/details/126002124