这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
读入一个用邻接矩阵存储的无向连通图,输出它的广度(宽度)优先遍历序列。
第一行一个正整数 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
-
相关阅读:
加缪——人生到底有什么意义?生命的意义就是生命本身
PG数据库表及表注释查询语句
openEuler学习——部署MGR集群
React 全栈体系(四)
Java泛型
第二十九篇 动态组件 - component
JVM核心知识体系
安卓环境搭建及运行安卓应用
8+铜死亡+分型+预后模型
Mac如何搭建Vue项目
-
原文地址:https://blog.csdn.net/HackerQY/article/details/126002124