优化下列代码void bfs(int s) { //邻接表存储图,访问点 s queue<int> que; visited[s] = true; // 将起点 s 标记并放到队列 que.push(s); while (!que.empty()) { // int now = que.front(); printf("%d ", now); for (Edge* p = head[now]; p != NULL; p = p->next) { // 广度优先遍历邻接点 if (!visited[p->to]) { que.push(p->to); // 找到未被访问过的邻接点加入队列,并标记 visited[p->to] = true; } } } } // 假设全局变量已经定义好了 int main() { memset(visited, false, sizeof(visited)); // 如果是有向图,必须用循环才能保证所有的结点都遍历到 // 如果是连通的无向图,从任一结点开始即可 for (int i = 1; i <= n; ++i) { if (!visited[i]) { bfs(i); } } return 0; }
时间: 2024-02-14 19:12:32 浏览: 55
这段代码是广度优先搜索遍历一个图的算法实现,其中使用了邻接表存储图的结构。对于优化,可以考虑以下几点:
1. 使用bool数组代替visited数组
在代码中,visited数组用于标记每个节点是否被访问过,可以将其改为bool类型的数组,这样可以节省空间并提高效率。
2. 将标记放在节点入队时处理
在当前代码中,每次处理节点时都要进行访问标记的操作,可以在节点入队时进行标记,这样可以避免重复操作。
3. 将邻接点遍历改为迭代器
在当前代码中,邻接点的遍历使用了指针的方式,可以考虑使用迭代器的方式,这样可以提高代码的可读性和可维护性。
优化后的代码如下:
```cpp
void bfs(int s) {
queue<int> que;
vector<bool> visited(n + 1, false); // 使用bool数组代替visited数组
visited[s] = true;
que.push(s);
while (!que.empty()) {
int now = que.front();
printf("%d ", now);
que.pop(); // 出队操作
for (auto p = head[now]; p != NULL; p = p->next) { // 使用迭代器遍历邻接点
if (!visited[p->to]) {
visited[p->to] = true;
que.push(p->to); // 入队操作时进行标记
}
}
}
}
int main() {
// 如果是有向图,必须用循环才能保证所有的结点都遍历到
// 如果是连通的无向图,从任一结点开始即可
for (int i = 1; i <= n; ++i) {
bfs(i);
}
return 0;
}
```
阅读全文