1)前言: |
前几个大佬写的题解我的大都看了一遍, 邻接表实现, 非递归实现真的不错, 非常适合想多学一些的同学们, 有助于扩展思维. 然后有一点要注意:有几个题解书写的代码没有考虑非连通图, 但是本题的测试用例依然通过了, 这里给出我的朴素代码(AC), 希望大家以后遇到非连通图的时候不要慌 |
2)解题思路: |
a:定义 一维数组作为访问标记数组标记第I个节点是否被访问过, 要初始化为false(在有些题中要定义二维数组) 二位数组作为图的邻接矩阵(建议开成全局的, 可以开的规模更大) b:函数 Init_matrix()初始化图(不想多说) DFS(int v)深度优先搜索 (PS:上面这几个东西是最基本的, 要记住!!) c:DFS思路 主函数中 在访问标记数组里面每一个元素的下标对应图中的一个节点序号 遍历访问标记数组(这里就可以防止出现连通分量未被访问的情况, 一旦一次递归结束还有节点未访问, 这个循环会找到一个新的未被访问的新节点作为下一次递归的开始) 挨个找到未被访问的节点 调用DFS(形参传递当前节点的序号); DFS(int now)中 访问now节点(在这里就可以对当前节点做出一些操作, eg:赋值, 带回值啊什么的, 具体看题) 标记成已经访问 在邻接矩阵中找到所有与该节点有关系且未访问的节点(与字前面代表循环, 后面是判断条件) 调用DFS(i); |
3)参考代码: |
1. #include <bits/stdc++.h> 2. #define maxv 50 3. #define _for(i,v,n) for(int i = v;i<n ; i++) 4. using namespace std; 5. 6. int n; 7. int record = 0; 8. int _map[maxv + 5][maxv + 5]; 9. bool visited[maxv]; 10. 11. void Init_matrix() { 12. _for(i, 0, n) 13. _for(j, 0, n) 14. scanf_s("%d", &_map[i][j]); 15. } 16. void DFS(int now) { 17. visited[now] = true; 18. record++; 19. printf("%d%s", now, record == n ? "\n" : " "); 20. _for(i, 0, n) 21. if (!visited[i] && _map[now][i]) 22. DFS(i); 23. return; 24. } 25. 26. int main() { 27. scanf_s("%d", &n); 28. memset(_map, 0, sizeof(_map)); memset(visited, false, sizeof(visited)); 29. Init_matrix(); 30. _for(i, 0, n)//遍历visited数组 //防止出现连通分量 31. if (!visited[i]) DFS(i); 32. return 0; 33. } 34. /* 35. 36. */ 37. 38. /* 39. 0 1 0 1 0 40. 1 0 0 0 0 41. 0 0 0 1 0 42. 1 0 1 0 0 43. 0 0 0 0 0 44. */ |
(PS:在word排了十多分钟格式, 这里竟然不兼容 555555555) |
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:610 |
C语言训练-素数问题 (C语言代码)浏览:1695 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:689 |
【金明的预算方案】 (C++代码)浏览:996 |
IP判断 (C语言代码)浏览:819 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:468 |
Tom数 (C语言代码)浏览:581 |
简单的a+b (C语言代码)浏览:491 |
盐水的故事 (C语言代码)浏览:1602 |
分解质因数 (C++代码)浏览:1560 |