关于本蒟蒻初学DFS

在寒假集训中的某一节课中(划水太严重忘了哪一节)看到了穆学长做的程序,首先惊叹于学长的能力(YYDS!)其次对于展示的动图能够生动形象的展示出深度优先遍历广度优先遍历的区别。

本文只浅谈DFS

类似于一条路走到最后的感觉(一根树上吊死)(不见南墙不回头)

但是遍历到最后能得到迷宫的所有结果

重点是对递归的理解相当于E - 爬楼梯 | SDUT OnlineJudge的高级版前路不通会在此路找到另一条走法,直到当前没有路才会返回到上一层

经典例题

 

 

 1 #include <bits/stdc++.h>
 2 #define endl '\n'
 3 #define x first
 4 #define y second
 5 #define int long long
 6 #define Tang ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 7 
 8 using namespace std;
 9 
10 const int N=10;
11 const int INF=0x3f3f3f3f;
12 const int mod=1e9+7;
13 
14 int n;
15 int q[N];
16 int path[N];
17 bool st[N];
18 
19 void dfs(int u)
20 {
21     
22     if(u>n)
23     {
24         for(int i=1;i<n;i++)
25             cout << path[i] << ",";
26         cout << path[n] << endl;
27         return;
28     }
29     for(int i=1;i<=n;i++)
30     {
31         if(!st[i])
32         {
33             path[u]=q[i];
34             st[i]=true;
35             dfs(u+1);
36             path[u]=0;
37             st[i]=false;
38         }
39     }
40     
41 }
42 
43 void solve()
44 {
45     
46     cin >> n;
47     for(int i=1;i<=n;i++)
48         cin >> q[i];
49     dfs(1);
50     
51 }
52 
53 signed main()
54 {
55     Tang
56     int T=1;
57         //cin >> T;
58     while(T--)
59         solve();
60     
61     return 0;
62         
63 }

 

 

 

 1 #include <bits/stdc++.h>
 2 #define endl '\n'
 3 #define x first
 4 #define y second
 5 #define int long long
 6 #define Tang ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 7 
 8 using namespace std;
 9 
10 const int N=1e5+10;
11 const int INF=0x3f3f3f3f;
12 const int mod=1e9+7;
13 
14 int n;
15 int h[N],e[N*2],ne[N*2],idx;
16 int ans=N;
17 bool st[N];
18 
19 void add(int a,int b)
20 {
21     e[idx]=b;ne[idx]=h[a];h[a]=idx++;
22 }
23 
24 int dfs(int u)  //从任何一个点开始搜结果都是一样的
25 {
26     st[u] = true; //将该点标记一下
27 
28     int size = 0, sum = 0;  //size为去最大的子节点连通块的数量,sum为该点的儿子节点的所有连通块的数量
29     for (int i = h[u]; i != -1; i = ne[i])
30     {
31         int j = e[i];
32         if (st[j]) continue;
33 
34         int s = dfs(j);
35         size = max(size, s);
36         sum += s;
37     }
38 
39     size = max(size, n - sum - 1);  //子节点最大连通块的数量和父节点剩余连通块数量之中的最大值就是每一个答案的候选项
40     ans = min(ans, size);   //用ans存其中最小的size就是答案
41 
42     return sum + 1;
43 }
44 
45 void solve()
46 {
47     
48     cin >> n;
49     
50     memset(h,-1,sizeof h);
51     
52     for(int i=0;i<n-1;i++)
53     {
54         int a,b;
55         cin >> a >> b;
56         
57         add(a,b),add(b,a);
58     }
59     
60     dfs(1);
61     
62     cout << ans << endl;
63     
64 }
65 
66 signed main()
67 {
68     Tang
69     int T=1;
70         //cin >> T;
71     while(T--)
72         solve();
73     
74     return 0;
75         
76 }

 


 

posted @ 2022-02-25 13:52  MrSugarT  阅读(35)  评论(0编辑  收藏  举报