图的遍历(深度优先遍历 + 广度优先遍历)

目录

🌼广度优先遍历

(1)邻接矩阵BFS

(2)邻接表BFS

(3)非连通图BFS

(4)复杂度分析

🌼深度优先遍历

(1)邻接矩阵的DFS

(2)邻接表的DFS

(3)非连通图的DFS

(4)复杂度

🌼刷题

📕油田

📕理想路径

📕骑士的旅程

📕抓住那头牛


🌼广度优先遍历

《啊哈算法第四章之bfs》(17张图解)-CSDN博客

Breadth First Search,BFS

一层一层地访问

秘籍:先被访问的节点,其邻接点先被访问

可用队列实现 

广度优先遍历经过的节点和边,被称为,广度优先生成树

如果遍历非连通图,每个连通分量,都会产生一棵广度优先生成树

以下代码结合图的存储的结构体进行理解👇

图的存储(邻接矩阵,边集数组,邻接表,链式前向星)-CSDN博客

(1)邻接矩阵BFS

void BFS_AM(AMGraph G, int v) // 基于邻接矩阵的广度优先遍历
{int u, w;queue<int>Q; // 创建队列(先进先出), 存放 intcout << G.Vex[v] << "\t";visited[v] = true;Q.push(v); // 源点 v 入队while(!Q.empty()) { u = Q.front(); // 取队头元素Q.pop(); // 队头出队for (w = 0; w < G.vexnum; w++) { // 遍历 u 所有邻接点if (G.Edge[u][w] && !visited[w]) { // u,w 邻接 且 w 未被访问cout << G.Vex[w] << "\t";visited[w] = true; // 标记Q.push(w); // 入队}}}   
}

(2)邻接表BFS

void BFS_AL(ALGraph G, int v) // 基于邻接表的广度优先遍历
{int u, w;AdjNode *p; // 邻接表结构体的指针queue<int>Q; // 创建队列cout << G.Vex[v].data << "\t";visited[v] = true; // 该邻接点下标 v 已访问Q.push(v); // 源点 v 入队while (!Q.empty()) {u = Q.front(); // 取队头元素Q.pop(); // 队头出队p = G.Vex[u].first; // u 的第 1 个邻接点while (p) { // 依次遍历 u 所有邻接点w = p->v; // u 邻接点下标if (!visited[w]) { // w 未被访问cout << G.Vex[w].data << "\t";visited[w] = true;Q.push(w); }p = p->next; // u 下一个邻接点}}    
}

(3)非连通图BFS

void BFS_AL(ALGraph G) 
{for (int i = 0; i < G.vexnum; i++) { // 检查未被访问的点if (!visited[i]) // 以 i 为起点, 再次广度优先遍历BFS_AL(G, i); // 基于邻接表, 也可换邻接矩阵}
}

(4)复杂度分析

基于邻接矩阵 OR 邻接表的,空间复杂度,都是 O(n)

都使用一个辅助队列,每个节点只入队 1 次,共 n 个节点,所以是 O(n)

时间 

(1)邻接矩阵

每个节点邻接表 -> O(n)

共 n 个节点,O(n^2)

(2)邻接表

d(vi) 为 vi 的出度

每个节点邻接点 -> O( d(vi) )

有向图,出度的和 = 边数 e,所以查找邻接点为 O(e)

无向图,所有所有节点的度的和为 2e,即每条边被记录 2 次,O(2e),即O(e)

加上初始化的 O(n),总的时间复杂度为 O(n + e)

🌼深度优先遍历

《啊哈算法》之DFS深度优先搜索-CSDN博客

Depth First Search,DFS

秘籍:后被访问的节点,其邻接点先被访问

通过栈实现,因为递归本身就是用栈实现的

当某个节点,没有未被访问过的邻接点时,需要 回退 到上一个节点

(1)邻接矩阵的DFS

void DFS_AM(AMGraph G, int v) // 节点下标 v
{cout << G.Vex[v] << "\t";visited[v] = true;for (int w = 0; w < G.vexnum; w++) // 依次遍历 v 所有邻接点if (G.Edge[v][w] && !visited[w]) // v, w邻接, 且 w 未被访问DFS_AM(G, w); // w 节点出发, 递归深度优先遍历
}

(2)邻接表的DFS

void DFS_AL(ALGraph G, int v) 
{AdjNode *p; // AdjNode 邻接点结构体cout << G.Vex[v].data << "\t";visited[v] = true;p = G.Vex[v].first; // v 的第 1 个邻接点while(p) { // 依次遍历 v 所有邻接点int w = p->v; // w 为 v 邻接点下标if (!visited[w]) // w 未被访问DFS_AL(G, w); // w出发, 递归深度优先遍历// 由上面DFS, 先被访问节点, 邻接点后被访问p = p->next; // v 下一邻接点}
}

(3)非连通图的DFS

void DFS_AL(ALGraph G) 
{for (int i = 0; i < G.vexnum; i++) {if (!visited[i])DFS_AL(G, i); // i 出发, 继续DFS}
}

(4)复杂度

邻接矩阵,时间 O(n^2),空间 O(n)

邻接表,时间 O(n + e),空间 O(n) 

图和邻接矩阵是唯一对应的,那么,基于邻接矩阵的BFS和DFS,也唯一对应

但是邻接表,会因为  边的输入顺序 OR 正序逆序建表,的不同,影响邻接表中邻接点的顺序,所以,基于邻接表的BFS,DFS,的序列不唯一

🌼刷题

📕油田

Oil Deposits - UVA 572 - Virtual Judge (vjudge.net)

思路 

(1)两层 for 遍历所有位置,如果该位置,未标记连通分量 且 是油田 '@',从这个位置开始DFS

(2)每次DFS开始前,需要判断是否出界

(3)水平 / 垂直 / 对角线,算作相邻,那么从一个位置出发,有 8 个方向需要 DFS

解释

(1)连通分量

比如 setid[x][y] = 1,(x, y) 表示一个点,如果这一堆点 setid[][] 都是 1,那么它们属于同一个连通分量,利用 cnt++,cnt 从0开始,最后输出 cnt 即可,表示有 cnt 个油藏

(2)坑

a. 每次 dfs 都要给该点的 setid 标记非 0 值,所以,每个 dfs 开头,要对 

“已有连通分量 || 不是油田” 的情况,进行 return

b. 每次 cin >> m >> n 后,记得 memset setid 数组(多组输入常犯错误)

AC  代码 

#define REP(i,b,e) for(int i=(b); i<=(e); i++)
#include<iostream>
#include<cstring>
using namespace std;const int N = 110;
string str[N]; // 字符矩阵
int m, n, setid[N][N]; // 行, 列, 连通分量void dfs(int x, int y, int cnt)
{// 出界if (x < 0 || y < 0 || x >= m || y >= n) return; // 已有连通分量 OR 不是油田if (setid[x][y] || str[x][y] != '@') return;// 标记setid[x][y] = cnt;// 递归遍历 8 个方向REP(i,-1,1)REP(j,-1,1) {if (!i && !j) continue; // 同时为0, 原来的点dfs(x+i, y+j, cnt);}
}int main()
{while(cin >> m >> n) {if (!m && !n) break;// 初始化memset(setid, 0, sizeof(setid));int cnt = 0; // 油藏数量// 读入字符矩阵REP(i,0,m-1) // m 行cin >> str[i];// 对每个点 dfsREP(i,0,m-1)REP(j,0,n-1) // n 列if (!setid[i][j] && str[i][j] == '@') // 未标记且油田dfs(i, j, ++cnt);cout << cnt << endl;} return 0;  
}

📕理想路径

理想路径 Ideal Path - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Ideal Path - UVA 1599 - Virtual Judge (vjudge.net)

基于BFS的最短路径算法。它首先进行逆向标高求最短距离,然后求解经过边的颜色序列最小,即字典序最小

具体意思是:比如 3 5 1 9 9  < 3 5 2 1 1

求的是,最小字典序的序列,而不是最小权值和

结合题目就是👇

采取 BFS,因为 边权为 1

本题采用 链式前向星 存储

  bfs1() + bfs2()

队列 q1:邻接边终点

队列 q2:邻接边边权(颜色的值)

队列 q3:最小边权终点

总体脉络

看着很复杂,其实很多重复的代码 

(1)你需要知道 链式前向星 的存图方式

(2)访问邻接点的代码(板子)

(3)BFS 的代码(板子)

(4)bfs1() 和 bfs2(),都需要 vis[] 防止重复访问已访问过的点

(5)bfs1() 从终点出发,找到每个点到终点的最小距离

(6)add() 加边(板子)

bfs2() 从起点出发,按照 距离-1 的方向,找到边的最小权值的点,再从这些点,再次扩展

关于为什么,不能从起点找最短距离( bfs1() ),我还不是很理解,因为没有现成的例子

先记板子吧

想要非常流畅地敲出来,一遍AC,你需要熟记

1,链式前向星的板子(add() 加边,struct结构体,访问邻接点)

2,BFS 遍历图的板子

AC  代码

评测系统有点问题,《算法训练营》源码 OR 洛谷题解代码,都是 Unknown Error 或者 Runtime Error,所以,过了样例就当 AC 了吧 

#include<iostream>
#include<cstring> // memset()
#include<queue>
using namespace std;const int N = 1e5 + 10, M = 2e5 + 10, inf = 0x7fffffff;int n, m, cnt; // 节点数, 边数, 边的计数
int head[N], dis[N]; // 邻接表头节点, 节点到终点最短距离
bool vis[N]; 
queue<int> q1, q2, q3; // q1邻接边终点, q2边权, q3最小边权终点struct Edge 
{int to, c, next; // 边的终点, 边权, 下一条边索引
}e[M]; // 边数组void add(int u, int v, int c) // 起点u, 终点v, 边权c
{// 边的下标 1 开始e[++cnt].to = v; // 终点e[cnt].c = c; // 权值// 头插法(倒序插入)e[cnt].next = head[u]; // 下一条边索引head[u] = cnt; // 更新头节点的第 1 条边
}void bfs1() // 逆向求最短距离
{int u, v; // 边的起点, 终点memset(vis, 0, sizeof(vis)); // 初始化标记数组dis[n] = 0;q1.push(n); // 终点加入队列vis[n] = 1; while (!q1.empty()) {u = q1.front(); // 取队首q1.pop();vis[u] = 1;// 从节点第 1 条边开始, 依次遍历邻接点for (int i = head[u]; i; i = e[i].next) {v = e[i].to; // 边终点编号, 即邻接点编号if (vis[v]) continue; // 防止重复访问dis[v] = dis[u] + 1; // 更新邻接点到终点最短距离q1.push(v);vis[v] = 1;}}
}void bfs2() // 正向求最小字典序
{int u, v, minc, c; // 边的起点, 终点, 最小边权, 边权bool first = 1; // 第 1 个边权前不要空格memset(vis, 0, sizeof(vis));vis[1] = 1;// 遍历 起点 邻接点 -- 类似初始化, 为后续循环提供条件for (int i = head[1]; i; i = e[i].next) if (dis[e[i].to] == dis[1] - 1) { // 往终点方向距离 -1 的点q1.push(e[i].to); // 加入邻接点q2.push(e[i].c); // 加入边权}while (!q1.empty()) { // 队列不为空, 未扩展完minc = inf; // 最小初始化为无穷大// 寻找当前队列最小边权while (!q1.empty()) {v = q1.front(); // 取邻接点下标q1.pop(); c = q2.front(); // 取边权q2.pop();if (c < minc) {// 先清空 q3while (!q3.empty()) q3.pop();minc = c; // 更新最小边权}if (c == minc) q3.push(v); // 所有边权是最小值的邻接点, 都加入 q3}// 输出路径边权if (first) first = 0; // 第 1 个边权前, 不输出 空格else cout << " ";cout << minc; // 对,最小边权的邻接点, 进行扩展while (!q3.empty()) {u = q3.front(); q3.pop(); // 取队首if (vis[u]) continue;vis[u] = 1;// 遍历最小边权邻接点的, 每一个邻接点for (int i = head[u]; i; i = e[i].next) {v = e[i].to;if (dis[v] == dis[u] - 1) { // 往终点距离 -1 的点q1.push(v); // 邻接点入队列q2.push(e[i].c); // 边权入队}}}}
}int main()
{int u, v, c;while (cin >> n >> m) { // 多组输入// dis[] 在 bfs1() 被更新, vis[] 在1, 2都有被更新memset(head, 0, sizeof(head)); // 更新 头节点数组cnt = 0; // 更新边的计数// 添加边for (int i = 1; i <= m; ++i) {cin >> u >> v >> c; // 起点, 终点, 边权add(u, v, c), add(v, u, c); // 无向}bfs1(); // 反向求最短距离cout << dis[1] << endl; // 起点到终点最短距离bfs2(); // 根据最短距离, 求最小字典序cout << endl; // 多组输入}return 0;
}

📕骑士的旅程

链接 

2488 -- A Knight's Journey (poj.org)

A Knight's Journey - POJ 2488 - Virtual Judge (vjudge.net)

题解 

马走日,可以在棋盘,任一地方开始和结束

为了字典序最小,只需要从 A1 开始DFS

贴几个题解博客👇

POJ 2488 - A Knight's Journey | 眈眈探求 (exp-blog.com)

POJ2488-A Knight's Journey(DFS+回溯)-腾讯云开发者社区-腾讯云 (tencent.com)

解释1

解释下代码中的 return flag = 1;

等价于    flag = 1; return flag; 

还有就是 dfs() 中, if() 的判断条件 !flag,因为 if() 里面还有 dfs() 递归,如果不加上 !flag 的判断,会得到所有路径,而不只是按字典序排序的第 1 条路径

题目分析(腾讯云): 

1. 应该看到这个题就可以想到用DFS,当首先要明白这个题的意思是能否只走一遍(不回头不重复)将整个地图走完,而普通的深度优先搜索是一直走,走不通之后沿路返回到某处继续深搜。所以这个题要用到的回溯思想,如果不重复走一遍就走完了,做一个标记,算法停止;否则在某种DFS下走到某一步时按马跳的规则无路可走而棋盘还有为走到的点,这样我们就需要撤消这一步,进而尝试其他的路线(当然其他的路线也可能导致撤销),而所谓撤销这一步就是在递归深搜返回时重置该点,以便在当前路线走一遍行不通换另一种路线时,该点的状态是未访问过的,而不是像普通的DFS当作已经访问了

2. 如果有多种方式可以不重复走一遍的走完,需要输出按字典序最小的路径,而注意到国际象棋的棋盘是列为字母,行为数字,如果能够不回头走一遍的走完,一定会经过A1点,所以我们应该从A1开始搜索,以确保之后得到的路径字典序是最小的(也就是说如果路径不以A1开始,该路径一定不是字典序最小路径),而且我们应该确保优先选择的方向是字典序最小的方向,这样我们最先得到的路径就是字典序最小的。

本题 dfs() 中,最后只需要 vis[][] = 0; 

用来取消标记,便于回溯

那么为什么不需要对 path[step][0] 和 path[step][1] 归0呢

因为每次新的 dfs( , , step) 递归时,会对上一步的 path 进行覆盖

4

if (!flag) { // 关键一步, 否则输出的不是第 1 条路径

代码第 23 行,dfs() 中,每一步递归前,都需要判断,是否已经满足字典序顺序的第 1 条路径 

5

// int dir[8][2] = {1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1}; 
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}; // 方向数组也要按字典序

注释掉的方向数组,没按字典序,因为字典序的第 1 条路径,必须保证,行 / 列 尽可能的小

所以行从 -2 到 -1 到 1 到 2,列也是依次小到大

AC  代码

#include<iostream>
#include<cstring>
using namespace std;// 列  行   标记数组    满足条件    输出路径
int m, n, vis[30][30], flag, path[30][2];
// int dir[8][2] = {1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1}; 
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}; // 方向数组也要按字典序int dfs(int x, int y, int step)  // (x, y), 第 step 步
{if (step == n*m) { // 步数 = 格子总数// return flag = 1;flag = 1;return flag;}// 遍历 8 个方向for (int i = 0; i < 8; ++i) {int tx = x + dir[i][0];int ty = y + dir[i][1];if (tx < 1 || tx > n || ty < 1 || ty > m || vis[tx][ty]) // 注意行列反转continue; // 越界 或 已访问if (!flag) { // 关键一步, 否则输出的不是第 1 条路径// 标记vis[tx][ty] = 1;path[step][0] = tx;path[step][1] = ty;// 递归dfs(tx, ty, step + 1);// 取消标记(回溯)vis[tx][ty] = 0;}}return flag;
}int main()
{int t, cnt = 1;cin >> t;while (t--) {cin >> m >> n;// 初始化memset(vis, 0, sizeof(vis)); flag = 0;// 起点 (1 ,1) 加入 pathpath[0][0] = 1; path[0][1] = 1; vis[1][1] = 1; // 起点已走过cout << "Scenario #" << cnt++ << ":" << endl;if (dfs(1, 1, 1)) // 1,1 是起点, 第 3 个参数, 起点算 1 步for (int i = 0; i < n*m; ++i)cout << char(path[i][0] + 'A' - 1) << path[i][1]; // 记得 -1else cout << "impossible";cout << endl << endl; // 两次换行, 才有间隔一行的效果}return 0;
}

📕抓住那头牛

3278 -- Catch That Cow (poj.org)

Catch That Cow - POJ 3278 - Virtual Judge (vjudge.net)

一道很好的,加深对 DFS 和 BFS 理解的,简单题(当然,首先要找规律) 

(1)n 为 0,只能先往前走 1 步,此时 n = 1,ans++

(2)分类讨论

dfs(t) 表示人位置 n,到位置 t 的最小步数

1) t <= n,只能一步一步后退,需要 n - t 步

2)t 为偶数,取 min( dfs(t/2) + 1, t - n )

3)t 为奇数,取 min( dfs(t - 1) + 1, dfs(t + 1) + 1 )

int dfs() 中 return 即可

AC  DFS

#include<iostream>
#include<cmath>
using namespace std;int n, k, ans; // n 人位置, k 牛位置int dfs(int t) // t 牛位置
{if (t <= n) return  n - t;if (t % 2) {// cout << t << endl;return min(dfs(t-1) + 1, dfs(t+1) + 1);}else if (t % 2 == 0) {// cout << t << endl;return min(dfs(t/2) + 1, t - n);}return -1; // 非法返回
}int main()
{cin >> n >> k;if (n == 0) n = 1, ans++; ans += dfs(k);cout << ans;return 0;
}

(1) k <= n,只能一步一步后退,输出 n - k

(2)从 人的位置 n 开始 BFS,每个节点可以扩展 3 个位置

👆上图,从 人的位置 5 开始,第一次扩展得到 4, 6, 10,第二次扩展,再分别从4,6,10开始

AC  BFS

#include<iostream>
#include<queue>
using namespace std;const int N = 1e5 + 10;
int n, k, d[N], vis[N]; // d[] 答案数组, vis[] 标记数组void bfs()
{queue<int> q;// 当前位置加入队列d[n] = 0; // 距离(时间)为 0vis[n] = 1; // 已访问q.push(n); // 起点入队while (!q.empty()) { // 直到扩展到目标点, 或者访问完所有点int u = q.front(); q.pop(); // 取队头if (u == k) { // 到达目标点cout << d[u]; return;}// 每个节点可以扩展 3 个位置int x;// 左一步x = u - 1;if (x >= 0 && x <= 1e5 && !vis[x]) { // 不超限 且 未访问// 加入队列d[x] = d[u] + 1; // 时间 + 1vis[x] = 1; // 标记q.push(x);}// 右一步x = u + 1;if (x >= 0 && x <= 1e5 && !vis[x]) {d[x] = d[u] + 1;vis[x] = 1;q.push(x);}// 坐车 * 2x = u * 2;if (x >= 0 && x <= 1e5 && !vis[x]) {d[x] = d[u] + 1;vis[x] = 1;q.push(x);}}
}int main()
{cin >> n >> k; // n 人位置, k 牛位置if (k <= n) cout << n - k;else {bfs();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/215123.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】地址空间

本片博客将重点回答三个问题 什么是地址空间&#xff1f; 地址空间是如何设计的&#xff1f; 为什么要有地址空间&#xff1f; 程序地址空间排布图 在32位下&#xff0c;一个进程的地址空间&#xff0c;取值范围是0x0000 0000~ 0xFFFF FFFF 回答三个问题之前我们先来证明地址空…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队…

JVS低代码表单引擎:数据校验与处理的先锋

随着信息技术的迅速发展&#xff0c;数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息&#xff0c;如密码处理时&#xff0c;其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能&#xff0c;它能够在用户填写数据的…

网贷教父判无期,千家万户哭成狗

作者&#xff5c;翻篇 新熔财经快评&#xff1a; 真是太气人了 e租宝崩盘后 比它更大的雷又来了 “网贷教父”周世平 非法吸收公众存款1090亿 被判了无期 48万多人的血汗钱啊 就这样血本无归了 要知道 当年周世平做p2p 就靠着全额垫付 这颗定心丸 大量的宝妈 上…

Elasticsearch:什么是检索增强生成 (RAG)?

检索增强生成 (RAG) 定义 检索增强生成 (RAG) 是一种利用来自私有或专有数据源的信息来补充文本生成的技术。 它将旨在搜索大型数据集或知识库的检索模型与大型语言模型 (LLM) 等生成模型相结合&#xff0c;后者获取该信息并生成可读的文本响应。 检索增强生成可以通过添加来…

react-photo-view 的介绍、安装、使用。

目录 基本介绍 安装 使用 基本介绍 react-photo-view 是一个基于 React 的图片查看器组件&#xff0c;用于在网页上展示和浏览图片。该组件提供了用户友好的界面和交互&#xff0c;可以轻松地在应用程序中集成并使用。 支持触摸手势&#xff0c;拖动/平移/物理效果滑动…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心&#xff1a;冒泡&#xff0c;持续比较相邻元素&#xff0c;大的挪到后面&#xff0c;因此大的会逐步往后挪&#xff0c;故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

深入探讨Guava的缓存机制

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Google Guava的缓存机制。缓存在现代编程中的作用非常大&#xff0c;它能提高应用性能&#xff0c;减少数据库压力&#xff0c;简直就是性能优化的利器。而Guava提供的缓存功能&#xff0c;不仅强大…

Linux 压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

目录 1、使用 tar 命令&#xff1a; 1.1. 压缩&#xff1a; 1.2. 解压&#xff1a; 1.3. tar 命令各参数含义 2. gzip、gunzip gzip 命令&#xff1a; 压缩文件&#xff1a; 保留原始文件&#xff0c;创建压缩文件&#xff1a; 保留原始文件&#xff0c;显示压缩进度&…

正则表达式(7):转义符

正则表达式&#xff08;7&#xff09;&#xff1a;正则表达式&#xff08;5&#xff09;&#xff1a;转义符 本博文转载自 此处&#xff0c;我们来认识一个常用符号&#xff0c;它就是反斜杠 “\” 反斜杠有什么作用呢&#xff1f;先不着急解释&#xff0c;先来看个小例子。 …

golang使用es,报错Elasticsearch health check failed

今天golang代码里调用es&#xff0c;结果一直报错。报错内容 ElasticsearchRestHealthIndicator : Elasticsearch health check failed然后又去es管理端看&#xff0c;明明节点是绿色的&#xff0c;估计是golang的这个有问题&#xff0c;时间紧迫&#xff0c;我就直接关掉了健…

侯捷C++ 程序的生前死后

生前&#xff1a;CRT startup code 看完课程&#xff0c;能够回答一下问题&#xff1a; C进入点是main()嘛&#xff1f;什么代码比main更早执行&#xff1f;什么代码在main结束后执行&#xff1f;为什么上述代码可以如此行为&#xff1f;Heap的结构如何&#xff1f;I/O的结构…

日志门面slf4j和各日志框架

简介 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架&#xff0c; 其主要意义在于提供接口&#xff0c;具体的实现可以交由其他日志框架&#xff0c;如log4j、logback、log4j2。 对于一般的Java项目而言&#xff…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展&#xff0c;VR虚拟现实技术已经逐渐融入我们的日常生活&#xff0c;尤其在党建领域&#xff0c;VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天&#xff0c;就让我们一起探讨VR数字党建展馆如何提供沉浸式体验&#xff0c;助力党建工作创新升级…

轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)

原理简介: 1. 基于rendering pass graph实现。 2. WGSL Shader 基于文件系统和宏机制动态组装。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PBRShadowTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&a…

【C语言】【数据结构】自定义类型:结构体

引言 这是一篇对结构体的详细介绍&#xff0c;这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&am…

手机升级到iOS15.8后无法在xcode(14.2)上真机调试

之前手机是iOS14.2的系统,在xcode上进行真机测试运行良好&#xff0c;因为想要使用Xcode的Instruments功能&#xff0c;今天将系统更新到了iOS15.8 &#xff0c;结果崩了 说是Xcode和手机系统不兼容不能进行真机测试。在网上查了好些方法&#xff0c;靠谱的就是下载相关版本的…

Centos7云服务器上安装cobalt_strike_4.7。附cobalt_strike_4.7安装包

环境这里是阿里的一台Centos7系统。 开始安装之前首先要确保自己安装了java11及以上环境。 安装java11步骤&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服务器端&#xff08;CS工具分服务器端和客户端&#xff09;的CS安装到服务器上后给目录下的…

【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 一. Java语言概述与优势1.1 Java的概述1.2 Java语言的优势 二. Java领域与发展史2.1 Java的使用领域2.…

【Linux20.04-qt5.12.4软件安装与初步使用-qt在Linux使用-记录-笔记】

【Linux-qt软件安装与初步使用-qt在Linux使用-记录-笔记】 1、概述2、环境说明3、步骤总结1、了解并选择自己想要安装的版本2、访问 Qt 官方网站3、在 Qt 网站上找到下载部分&#xff08;自己想下载&#xff09;4、下载完成后&#xff0c;给安装程序文件赋予执行权限。5、自动配…