搜索——dfs
本文主要内容:
- 基础复习
1 基础复习
- 主要功能:
- 递归枚举
- 深搜遍历
- …
- 注意事项:
- 递归结束条件要写正确
- 避免重复搜索带来的死循环
模板题1:Acwing842.排列数字
#include<iostream>
using namespace std;
const int N = 7;
int a[N], n;
bool vis[N];
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return;
}
for(int i = 1; i <= n; i++)
if(!vis[i])
{
vis[i] = true;
a[u] = i;
dfs(u + 1);
vis[i] = false;
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
模板题2:Acwing843.n-皇后问题
#include<iostream>
using namespace std;
const int N = 20;
char g[N][N];
int n;
bool col[N], dj[N], fdj[N];
void dfs(int u)
{
if(u == n)
{
for(int i = 0; i < n; i++)
puts(g[i]);
puts("");
return;
}
for(int i = 0; i < n; i++)
if(!col[i] && !dj[i - u + n] && !fdj[i + u])
{
col[i] = dj[i - u+ n] = fdj[i + u] = true;
g[u][i] = 'Q';
dfs(u + 1);
col[i] = dj[i - u+ n] = fdj[i + u] = false;
g[u][i] = '.';
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[i][j] = '.';
dfs(0);
return 0;
}
模板题3:Acwing846.树的重心
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 5;
int h[N], ne[N * 2], e[N * 2], idx = 1;
int n, ans = N;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u, int fa)
{
int sum = 1, res = 0;
for(int i = h[u]; i; i = ne[i])
{
int son = e[i];
if(son == fa)continue;
int t = dfs(son, u);
sum += t;
res = max(res, t);
}
res = max(res, n - sum);
ans = min(ans, res);
return sum;
}
int main()
{
cin >> n;
for(int i = 0, a, b; i < n - 1; i++)
{
cin >> a >> b;
add(a, b), add(b, a);
}
dfs(1, -1);
cout << ans;
return 0;
}