基于邻接矩阵的图的深度优先遍历
1 - 畅通工程
Problem:
思路
可以用基于邻接矩阵的图的深度优先遍历解题,还有一个稍微简洁的方式就是并查集
Code
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1010
#define M 10010
//N,M不要定义成变量,C语言不支持变长的数组
int a[N][M];
int b[N];
int n, m;//切记不要定义太多的全局变量,很容易串用,要随用随定
void dfs(int node) {
if (b[node] == 1) return;
b[node] = 1;
int i;
for (i = 1; i <= n; i++) {
if (a[node][i] == 1 && b[i] == 0) dfs(i);
}
}
int main() {
memset(a, 0, sizeof(a));//也可以不写
memset(b, 0, sizeof(b));//也可以不写
scanf("%d %d", &n, &m);
int z = 0;
for (z = 0; z < m; z++) {
int i, j;
scanf("%d %d", &i, &j);
a[i][j] = a[j][i] = 1;
}
// for (i = 1; i <= n; i++) {
// printf("\n");
// for (j = 1; j <= n; j++) {
// printf("%d ", a[i][j]);
// }
// }
// printf("\n");
int count = 0;
int j;
for (j = 1; j <= n; j++) {
if (b[j] == 0) {
dfs(j);
count++;
// printf("%d\n", j);
}
}
printf("%d", count - 1);
return 0;
}