1.图G是一个非连通图,共有28条边,则该图至少有多少个顶点? 2.对于稠密图和稀疏图,采用邻接矩阵和邻接表哪个更好些? 3.实现图的深度优先遍历和广度优先遍历算法。
时间: 2024-05-08 10:21:17 浏览: 51
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);
}
}
}
```
阅读全文