dfs _ bfs

存图

// // 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
// int h[N], e[N], ne[N], idx;

// // 添加一条边a->b
// void add(int a, int b)
// {
//     e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
// }

// // 初始化
// idx = 0;
// memset(h, -1, sizeof h);

dfs 树的重心

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define endl '\n'
#define mem(z, o) memset(z, o, sizeof(z))
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fr(l, ft, ed) for (int l = (ft); l <= (ed); ++l)

const int N = 1e6+10;
int n, h[N], e[N], ne[N], idx;
int vis[N], ans;
inline void add(int u, int v){ e[idx] = v, ne[idx] = h[u], h[u] = idx++; }

// ------------------- 树的重心 -----------------------
int dfs(int u)
{
    int res = 0, sum = 1;
    vis[u] = 1;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!vis[j])
        {
            int t = dfs(j);
            res = max(res, t);
            sum += t;
        }
    }
    res = max(res, n - sum);
    ans = min(ans, res);
    return sum;
}
signed main()
{
    IOS
    mem(h, -1);
    cin >> n;
    fr (i, 1, n-1)
    {
        int a, b; cin >> a >> b;
        add(a, b), add(b, a);
    }
    ans = N;
    dfs(1);
    cout << ans << endl;
    return 0;
}

dfs ------------------------- n 皇后 ---------------------

char g[10][10];
bool lie[10], de[10<<1], ude[10<<1];
int 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 (!lie[i] && !de[u + i] && !ude[n + u - i])
        {
            lie[i] = de[u + i] = ude[n + u - i] = 1;
            g[u][i] = 'Q';
            dfs(u+1);
            lie[i] = de[u + i] = ude[n + u - i] = 0;
            g[u][i] = '.';
        }
    }
}
signed main()
{
    // IOS
    cin >> n;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            g[i][j] = '.';
    Dfs(0);
    return 0;
}

-------------------------- Bfs ____ 八数码 ----------------------------------


using pii = pair<int, int>;
int d[][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
char gg[10];
unordered_map<string, int> mp;

int bfs(string &s)
{
    int z = s.find('x');
    string end = "12345678x";
    queue<string> que;
    que.push(s);
    mp[s] = 0;
    while (!que.empty())
    {
        auto t = que.front(); que.pop();
        int dd = mp[t];
        if (t == end) return dd;
        int k = t.find('x');
        for (int i = 0; i < 4; ++i)
        {
            int a = k / 3 + d[i][0], b = k % 3 + d[i][1];
            if (a >= 0 && a < 3 && b >= 0 && b < 3)
            {
                swap(t[k], t[a * 3 + b]);
                if (!mp[t])
                {
                    que.push(t);
                    mp[t] = dd + 1;
                }
                swap(t[k], t[a * 3 + b]);
            }
        }
    }
    return -1;
}
signed main()
{
    // IOS
    string s = "";
    for (int i = 0; i < 9; ++i)
            gg[i] = getchar(), getchar(), s += gg[i];
    cout << bfs(s) << endl;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容