基于邻接矩阵的图的深度优先遍历

1 - 畅通工程

Problem:

畅通工程
image
image

思路

可以用基于邻接矩阵的图的深度优先遍历解题,还有一个稍微简洁的方式就是并查集

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;
}
posted @ 2025-03-20 23:33  韩熙隐ario  阅读(28)  评论(0)    收藏  举报