无向图的邻接矩阵的深度优先搜索和广度优先搜索(C++实现)

一、深度优先搜索

深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可以从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。

1. 题目大意

在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。
输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
样例输入
4
0 1 0 1
1 0 0 0
0 0 0 1
1 0 1 0
样例输出
0 1 3 2
提示
在本题中,需要熟练掌握图的邻接矩阵存储方式。在建立完成无向图之后,需要严格按照题目描述的遍历顺序对图进行遍历。
通过这道题目,应该能够对图的深度优先搜索建立更加直观和清晰的概念。

2. 代码实现

#include <bits/stdc++.h>
 
int a[50][50],vis[50];
int n;
void dfs(int u);
 
using namespace std;
int main(){
   
    cin >> n;
    for(int
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用邻接矩阵存储的无向图的深度优先遍历广度优先遍历C++代码: ```c++ #include <iostream> #include <queue> using namespace std; const int MAXN = 100; // 最大顶点数 int graph[MAXN][MAXN]; // 邻接矩阵存储 bool visited[MAXN]; // 标记是否已经访问过 // 深度优先遍历 void dfs(int u) { visited[u] = true; cout << u << " "; for (int v = 0; v < MAXN; v++) { if (graph[u][v] && !visited[v]) { dfs(v); } } } // 广度优先遍历 void bfs(int u) { queue<int> q; visited[u] = true; q.push(u); while (!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; for (int v = 0; v < MAXN; v++) { if (graph[u][v] && !visited[v]) { visited[v] = true; q.push(v); } } } } int main() { // 初始化邻接矩阵和visited数组 for (int i = 0; i < MAXN; i++) { visited[i] = false; for (int j = 0; j < MAXN; j++) { graph[i][j] = 0; } } // 读入无向图 int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; graph[u][v] = graph[v][u] = 1; } // 深度优先遍历 cout << "DFS: "; for (int i = 0; i < n; i++) { if (!visited[i]) { dfs(i); } } cout << endl; // 广度优先遍历 for (int i = 0; i < MAXN; i++) { visited[i] = false; } cout << "BFS: "; for (int i = 0; i < n; i++) { if (!visited[i]) { bfs(i); } } cout << endl; return 0; } ``` 其中,`dfs(int u)` 函数实现了从顶点 `u` 开始的深度优先遍历,`bfs(int u)` 函数实现了从顶点 `u` 开始的广度优先遍历。在遍历时,需要使用 `visited` 数组来标记每个顶点是否已经访问过,避免重复访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值