多多狗


私信TA

用户名:18740205880

访问量:1097

签 名:

等  级
排  名 27466
经  验 500
参赛次数 8
文章发表 1
年  龄 0
在职情况 学生
学  校 辽宁工程技术大学
专  业

  自我简介:

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 人评分

  评论区