1.图G是一个非连通图,共有28条边,则该图至少有多少个顶点? 2.对于稠密图和稀疏图,采用邻接矩阵和邻接表哪个更好些? 3.实现图的深度优先遍历和广度优先遍历算法。
时间: 2024-05-08 18:21:17 浏览: 44
邻接表或者邻接矩阵为存储结构实现连通无向图的深度优先和广度优先遍历
3星 · 编辑精心推荐
1. 根据图的边数和顶点数的关系式:$e = \frac{n(n-1)}{2}$,可得 $n^2 - n - 56 = 0$,解得 $n \geq 8$,因此该图至少有8个顶点。
2. 对于稠密图(边数接近于 $n^2$)采用邻接矩阵更好,因为邻接矩阵可以在 $O(1)$ 的时间内判断任意两个顶点之间是否有边;对于稀疏图(边数远小于 $n^2$)采用邻接表更好,因为邻接表可以更节省空间。
3. 深度优先遍历算法:
```
void dfs(int u, vector<vector<int>>& graph, vector<bool>& visited) {
visited[u] = true;
// 对 u 进行操作
for (int v : graph[u]) {
if (!visited[v]) {
dfs(v, graph, visited);
}
}
}
void dfsTraversal(vector<vector<int>>& graph) {
int n = graph.size();
vector<bool> visited(n, false);
for (int u = 0; u < n; u++) {
if (!visited[u]) {
dfs(u, graph, visited);
}
}
}
```
广度优先遍历算法:
```
void bfs(int u, vector<vector<int>>& graph, vector<bool>& visited) {
queue<int> q;
q.push(u);
visited[u] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
// 对 u 进行操作
for (int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
void bfsTraversal(vector<vector<int>>& graph) {
int n = graph.size();
vector<bool> visited(n, false);
for (int u = 0; u < n; u++) {
if (!visited[u]) {
bfs(u, graph, visited);
}
}
}
```
阅读全文