试着优化以下代码:#include <stdio.h> #include <string.h> #define MAXN 1001 int n, m; int G[MAXN][MAXN], vis[MAXN]; void dfs(int u) { vis[u] = 1; for (int v = 1; v <= n; v++) { if (G[u][v] && !vis[v]) { dfs(v); } } } int main() { int T; scanf("%d", &T); while (T--) { memset(G, 0, sizeof(G)); memset(vis, 0, sizeof(vis)); scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); G[u][v] = G[v][u] = 1; } dfs(1); int flag = 1; for (int i = 1; i <= n; i++) { if (!vis[i]) { flag = 0; break; } } if (flag) { printf("yes\n"); } else { printf("no\n"); } } return 0; }
时间: 2024-01-24 15:01:46 浏览: 73
可以考虑使用邻接表来代替邻接矩阵,减少空间使用,并且可以提高遍历效率。另外,可以使用函数返回值来判断是否遍历到了所有节点,避免在遍历结束后再进行一次循环判断。
以下是优化后的代码:
```c++
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAXN 1001
using namespace std;
int n, m;
vector<int> G[MAXN];
int vis[MAXN];
bool dfs(int u) {
vis[u] = 1;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!vis[v]) {
if (!dfs(v)) {
return false;
}
}
}
return true;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
for (int i = 1; i <= n; i++) {
G[i].clear();
}
memset(vis, 0, sizeof(vis));
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
if (dfs(1)) {
printf("yes\n");
} else {
printf("no\n");
}
}
return 0;
}
```
其中,G是邻接表,vis是记录每个顶点是否被访问过的数组。在dfs函数中,使用bool类型的返回值表示是否遍历到了所有节点。在遍历结束后,直接根据dfs的返回值输出结果即可。
阅读全文