刷题 - 图论

1 | bfs/dfs | 网格染色

200. 岛屿数量

  • 访问到马上就染色(将visited标为 true)
  • auto [cur_x, cur_y] = que.front(); 结构化绑定(C++17)
  • 也可以不使用 visited数组,直接修改原始数组
  • 时间复杂度: O(n * m),最多将 visited 数组全部标为 true
  • 空间复杂度:考虑visited 数组的话就是 O(n*m), 原地修改就是 O(min(n, m)) 只考虑递归栈深度(DFS)或队列最大深度(BFS),栈深度或队列最多为网格的一边大小

在这里插入图片描述

[模板][dfs][染色]

class Solution {
public:const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};// 为什么 dfs 看起来好像没有终止条件?因为已经通过代码保证传入的节点都是合法节点void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size() || \grid[next_x][next_y] == '0' || \visited[next_x][next_y] == true) {continue;}visited[next_x][next_y] = true;dfs(grid, visited, next_x, next_y);}}int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == '1' && visited[i][j] == false) {++ans;visited[i][j] = true;dfs(grid, visited, i, j);}}}return ans;}
};
class Solution {
public:const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};// 不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断// 效率会略低一些void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {if (grid[x][y] == '0' || visited[x][y]) return;visited[x][y] = true;for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size()) {continue;}dfs(grid, visited, next_x, next_y);}}int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == '1' && visited[i][j] == false) {++ans;dfs(grid, visited, i, j);}}}return ans;}
};

[模板][bfs][染色]

class Solution {
public:const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int,int>> que;visited[x][y] = true;   // 在加入队列之前将其标为访问过que.push(make_pair(x, y));while (!que.empty()) {auto [cur_x, cur_y] = que.front();  // 结构化绑定que.pop();for (int i = 0; i < 4; ++i) {int next_x = cur_x + direction[i][0], next_y = cur_y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size() || \grid[next_x][next_y] == '0' || \visited[next_x][next_y] == true) {continue;}visited[next_x][next_y] = true;que.push(make_pair(next_x, next_y));}}}int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == '1' && visited[i][j] == false) {++ans;bfs(grid, visited, i, j);}}}return ans;}
};

在这里插入图片描述

类似题目

695. 岛屿的最大面积

在 染色的时候统计面积即可

visited[next_x][next_y] = true;
++area;

130. 被围绕的区域

在这里插入图片描述

两个步骤:

  • 从地图周边出发,将 ‘O’ 都做上标记,visited = true
  • 然后再遍历一遍地图,遇到 ‘O’ 且没做过标记的,那么都是地图中间的 ‘O’ ,全部改成 ‘X’ 就行

417. 太平洋大西洋水流问题

在这里插入图片描述

class Solution {
public:// 太平洋:i == 0 || j == 0// 大西洋:i == m-1 || j == n-1// 方式1:从每个节点出发,如果可以到达太平洋且大西洋,记录结果// 方式2:从四周出发,逆向找可达节点int direction[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};// array<array<int, 2>, 4> direction = {-1, 0, 0, -1, 1, 0, 0, 1};void dfs(const vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= heights.size() || \next_y < 0 || next_y >= heights[0].size() || \visited[next_x][next_y] == true ||heights[next_x][next_y] < heights[x][y]) {continue;}visited[next_x][next_y] = true;dfs(heights, visited, next_x, next_y);}}vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {int m = heights.size(), n = heights[0].size();vector<vector<bool>> pacific_visited(m, vector<bool>(n, false));vector<vector<bool>> atlantic_visited(m, vector<bool>(n, false));for (int i = 0; i < n; ++i) {if (pacific_visited[0][i] == false) {pacific_visited[0][i] = true;dfs(heights, pacific_visited, 0, i);}}for (int i = 1; i < m; ++i) {if (pacific_visited[i][0] == false) {pacific_visited[i][0] = true;dfs(heights, pacific_visited, i, 0);}}for (int i = 0; i < n; ++i) {if (atlantic_visited[m-1][i] == false) {atlantic_visited[m-1][i] = true;dfs(heights, atlantic_visited, m-1, i);}}for (int i = 0; i < m - 1; ++i) {if (atlantic_visited[i][n-1] == false) {atlantic_visited[i][n-1] = true;dfs(heights, atlantic_visited, i, n-1);}}vector<vector<int>> result;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (pacific_visited[i][j] && atlantic_visited[i][j]) {result.push_back({i,j});}}}return result;}
};

建造最大工岛

在这里插入图片描述

2 | bfs | 无权最短路径

  • 如果只需要路径长度,每次先获取队列的长度然后再往外扩展,或者可以采用使用 int 类型的 visited 数组来记录路径长度
  • 如果需要输出路径,需要记录节点的 前驱节点,最后从终点到起点获取前驱节点从而输出路径

[模板] 获取最短路径长度 - 记录steps

int bfs_shortest_path_length(const vector<vector<int>>& graph, int start, int goal) {int n = graph.size(); // 节点的总数queue<int> q; // 队列用于BFSvector<bool> visited(n, false); // 记录已经访问过的节点q.push(start);visited[start] = true;int steps = 0; // 用于记录步数while (!q.empty()) {int que_size = q.size();while (que_size--) {int node = q.front();q.pop();if (node == goal) {return steps;}for (int neighbor : graph[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}++steps;}return -1;
}

[模板] 获取最短路径 - 记录前驱节点

// 使用BFS寻找从start到goal的最短路径,并使用前驱数组记录路径
vector<int> bfs_shortest_path(const vector<vector<int>>& graph, int start, int goal) {int n = graph.size(); // 节点的总数vector<int> prev(n, -1); // 用于记录前驱节点,初始化为-1表示未访问queue<int> q; // 队列用于BFSunordered_set<int> visited; // 记录已经访问过的节点// 初始化BFSq.push(start);visited.insert(start);// 开始BFSwhile (!q.empty()) {int node = q.front();q.pop();// 如果找到了目标节点,回溯路径if (node == goal) {vector<int> path;for (int at = goal; at != -1; at = prev[at]) {path.push_back(at);}reverse(path.begin(), path.end());return path; // 返回从start到goal的路径}// 遍历当前节点的所有邻居for (int neighbor : graph[node]) {if (visited.find(neighbor) == visited.end()) {// 如果邻居节点未被访问,标记为已访问并记录前驱节点visited.insert(neighbor);prev[neighbor] = node;q.push(neighbor);}}}// 如果没有找到路径,返回空路径return {};
}

类似题目

[最短路径长度]1926. 迷宫中离入口最近的出口

在这里插入图片描述

class Solution {
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int m = maze.size(), n = maze[0].size();int x = entrance[0], y = entrance[1];queue<pair<int, int>> que;maze[x][y] = '+';que.push({x, y});// 定义四个方向:上、下、左、右const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int steps = 0;// 广度优先搜索while (!que.empty()) {int q_size = que.size();for (int i = 0; i < q_size; ++i) {auto [cur_x, cur_y] = que.front();que.pop();for (int d = 0; d < 4; ++d) {int next_x = cur_x + dir[d][0];int next_y = cur_y + dir[d][1];// 检查边界条件if (next_x < 0 || next_x >= m || \next_y < 0 || next_y >= n || \maze[next_x][next_y] == '+') {continue;}// 如果到达边界并且不是入口,返回步数if (next_x == 0 || next_x == m - 1 ||\next_y == 0 || next_y == n - 1) {return steps + 1;}// 标记为已访问,并将其加入队列maze[next_x][next_y] = '+';que.push({next_x, next_y});}}++steps;}// 如果没有找到出口,返回 -1return -1;}
};

[最短路径长度] 433. 最小基因变化

在这里插入图片描述

class Solution {
public:bool canConvert(const string& s1, const string& s2) {int diffCount = 0;for (int i = 0; i < s1.size(); ++i) {if (s1[i] != s2[i]) {if (++diffCount > 1) return false;}}return true;}int minMutation(string startGene, string endGene, vector<string>& bank) {if (startGene == endGene) return 0;int n = bank.size();int startIndex = -1, endIndex = -1;// 查找 startGene 和 endGene 在 bank 中的位置for (int i = 0; i < n; ++i) {if (bank[i] == endGene) endIndex = i;else if (bank[i] == startGene) startIndex = i;}// 如果终止基因不在 bank 中,直接返回 -1if (endIndex == -1) return -1;// 如果起始基因不在 bank 中,则将其作为附加节点处理if (startIndex == -1) startIndex = n;// 构建邻接表vector<list<int>> adj(n + 1);// 如果 startGene 不在 bank 中,构造与它相邻的节点if (startIndex == n) {for (int i = 0; i < n; ++i) {if (canConvert(startGene, bank[i])) {adj[n].push_back(i);}}}// 构造 bank 中基因的邻接关系for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (canConvert(bank[i], bank[j])) {adj[i].push_back(j);adj[j].push_back(i);}}}// BFS 进行最短路径搜索queue<int> q;vector<bool> visited(n + 1, false);q.push(startIndex);visited[startIndex] = true;int steps = 0;while (!q.empty()) {int que_size = q.size();while (que_size--) {int node = q.front();q.pop();// 找到终止基因,返回步数if (node == endIndex) return steps;// 遍历邻居节点for (int neighbor : adj[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}++steps; // 每一轮BFS增加一步}// 如果找不到转换路径,返回 -1return -1;}
};

[最短路径长度]127. 单词接龙

在这里插入图片描述

和最小基因变化基本没区别

3 | dfs | 回溯 | 所有可能路径

[模板] 797. 所有可能的路径

  • 本题为有向无环图,如果存在环的话需要加一个 visited 数组
  • 时间复杂度:O(2^n),最坏情况下可能有 2 的 n 次方条路径,其中 n 是图的节点数。
  • 空间复杂度:O(n),递归深度最深为 n(即从 0 到目标节点的最长路径长度),以及存储路径所需的空间。
// 有向无环图求所有可行路径
// 如果存在环的话需要加一个 visited 数组
class Solution {
public:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int start) {if (start == graph.size() - 1) {result.push_back(path);}for (auto& next : graph[start]) {path.push_back(next);dfs(graph, next);path.pop_back();}}vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0);dfs(graph, 0);return result; }
};

4 | 并查集 | 判断节点相连

[模板][有向图][无向图]

  • 并查集初始化:将所有节点的根节点初始化为节点本身
  • 在查询父节点的时候要执行路径压缩

有向边: 按方向合并

    struct UnionSet {vector<int> root;UnionSet(int n) : root(n, 0) {for (int i = 0; i < n; ++i) {root[i] = i;}}int Find(int u) {if (u == root[u]) return u;root[u] = Find(root[u]); // 路径压缩return root[u];}bool IsConnected(int u, int v) {return Find(u) == Find(v);}void Join(int u, int v) {int root_u = Find(u);int root_v = Find(v);root[root_v] = root_u;}};

无向边:按秩合并

  • 在并查集(Union-Find)的按秩合并中,通常用于表示树的高度(或深度)
  • 插入新连接的时候选择秩小的作为根节点
    在这里插入图片描述
  • 如果二者秩相同,秩需要加一
    在这里插入图片描述
struct UnionSet{vector<int> root;vector<int> rank;UnionSet(int n) : root(n, 0), rank(n, 1) {for (int i = 0; i < n; ++i) {root[i] = i;}}int Find(int u) {if (u == root[u]) return u;root[u] = Find(root[u]); // 路径压缩return root[u];}bool IsConnected(int u, int v) {return Find(u) == Find(v);}void Join(int u, int v) {int root_u = Find(u);int root_v = Find(v);if (rank[root_u] > rank[root_v]) {root[root_v] = root_u;} else if (rank[root_u] < rank[root_v]) {root[root_u] = root_v;} else {root[root_u] = root_v;rank[root_v]++;}}
};

类似题目

[无向边]684. 冗余连接

在这里插入图片描述

如果边的两个节点已经出现在同一个集合里,说明这条边的两个节点已经连在一起了,再加入这条边一定就出现环了。

    vector<int> findRedundantConnection(vector<vector<int>>& edges) {int n = edges.size();UnionSet union_set(n + 1);for (auto& edge : edges) {int u = edge[0], v = edge[1];if (union_set.IsConnected(u, v)) {return {u, v};} else {union_set.Join(u, v);}}return {};}

[有向边]685. 冗余连接 II

参考链接:【困难题简单做】分类讨论+并查集,击破hard
在这里插入图片描述

class Solution {
public:// 查找冗余的有向边vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {int n = edges.size();vector<int> parent(n + 1, 0);vector<int> edge_to_remove1, edge_to_remove2;int two_in_node = -1;// 检测入度为2的情况for (auto& edge : edges) {int u = edge[0], v = edge[1];if (parent[v] == 0) {parent[v] = u;} else {// 发现入度为2的节点 vtwo_in_node = v;edge_to_remove1 = {parent[v], v}; // 之前的边edge_to_remove2 = {u, v}; // 当前的边break;}}// 重建并查集,处理有环的情况UnionSet union_set(n + 1);for (auto& edge : edges) {int u = edge[0], v = edge[1];if (edge == edge_to_remove2) {// 跳过第二条边,先验证第一条边continue;}if (union_set.IsConnected(u, v)) {// 出现环//  + 如果不存在入度为2的节点,只需要考虑环的问题//  + 说明正是[u,v]导致环的出现,删除 [u, v] 即可    if (two_in_node == -1) return edge;//  + 存在入度为 2 的节点//  + edge_to_remove1 必然属于这个环的一部分//  + 否则就会出现两条不合法的边了,不合题意//  + 因此我们删除两个不合法的交集,也即 edge_to_remove1return edge_to_remove1;}union_set.Join(u, v);}// 循环正常结束,说明没有出现环// 说明异常情况为:存在入度为 2 的节点// 删除最后一条导致入度为 2 的边,也即 edge_to_remove2return edge_to_remove2;}
};

5 | 拓扑排序 | 有向图 | 判断是否有环 | 无环图线性排序

[模板]207. 课程表

  • 遍历所有边,记录所有节点的入度,将入度为 0 的节点加入队列和结果数组
  • 当队列不为空时,从队列中弹出节点,遍历节点的所有邻居,将邻居的入度减1,如果此时邻居的入度为0,则将该邻居加入队列和结果数组
  • 队列为空,若结果数组的长度不等于节点个数,说明存在环,否则返回结果数组
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<int> indegrees(numCourses, 0);vector<list<int>> adj(numCourses);for (const auto& pre : prerequisites) {++indegrees[pre[0]];adj[pre[1]].push_back(pre[0]);}int count = 0;queue<int> que;for (int i = 0; i < numCourses; ++i) {if (indegrees[i] == 0) {que.push(i);++count;}}while (!que.empty()) {int cur = que.front();que.pop();for (auto next : adj[cur]) {if (--indegrees[next] == 0) {que.push(next);++count;}}}return (count == numCourses);}
};

6 | Dijistra | 带正权图最短路径

[模板]参加科学大会

  • 使用 堆来存储当前最短路径节点 {节点到起点的距离, 节点索引}
  • 每次从优先队列中选择当前距离最小的未处理节点
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <list>
using namespace std;int dijkstra(vector<list<pair<int, int>>>& adj_list) {int n = adj_list.size() - 1; int start = 1, end = n;vector<int> costs(n + 1, INT_MAX);	// 记录距离vector<int> visited(n + 1, false);	// 标记是否找到最短路		// 堆存储 {节点到起点的距离,节点索引}priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;// 初始化costs[start] = 0;pq.push({0, start});while (!pq.empty()) {// 每次从优先队列中选择当前距离最小的未处理节点int cost = pq.top().first;int cur = pq.top().second;pq.pop();if (visited[cur]) continue;	// 节点已经访问过,跳过visited[cur] = true;			// 未访问过,标记为访问过if (cur == end) return costs[end];	// 到达终点// 遍历相邻节点for (auto& [next, time] : adj_list[cur]) {if (!visited[next] && costs[cur] + time < costs[next]) {// 找到更短的路径了   costs[next] = costs[cur] + time;pq.push({costs[next], next});}}}return -1;  // 如果没有路径到达终点
}int main(int argc, char* argv[]) {if (argc == 1) return -1;freopen(argv[1], "r", stdin);int n, m;cin >> n >> m;  // n 个 车站 m 条公路vector<list<pair<int, int>>> adj_list(n + 1);for (int i = 0; i < m; ++i) {   // 输入 m 条边:起点 终点 和 时间int start, end, time;cin >> start >> end >> time;adj_list[start].push_back({end, time});}cout << dijkstra(adj_list) << endl;return 0;
}

7 | Floyd | 多源最短路 | 动态规划 | 适合稠密图且源点较多

[模板]97. 小明逛公园

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <vector>
#include <list>
#include <climits>
using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, INT_MAX)));  // 因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2][0] = val;grid[p2][p1][0] = val; // 注意这里是双向图}// 开始 floydfor (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (grid[i][k][k-1] == INT_MAX || grid[k][j][k-1] == INT_MAX) {grid[i][j][k] = grid[i][j][k-1];} else {grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]);}      }}}// 输出结果int z, start, end;cin >> z;while (z--) {cin >> start >> end;if (grid[start][end][n] == INT_MAX) cout << -1 << endl;else cout << grid[start][end][n] << endl;}
}

空间优化

#include <iostream>
#include <vector>
#include <list>
#include <climits>
using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));  // 因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2] = val;grid[p2][p1] = val; // 注意这里是双向图}// 开始 floydfor (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (grid[i][k] != INT_MAX && grid[k][j] != INT_MAX) {grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);}      }}}// 输出结果int z, start, end;cin >> z;while (z--) {cin >> start >> end;if (grid[start][end] == INT_MAX) cout << -1 << endl;else cout << grid[start][end] << endl;}
}

8 | Prim | 贪心 | 最小生成树 | 花最小的代价连通所有的点

[模板] 53. 寻宝(第七期模拟笔试)

图-最小生成树-Prim(普里姆)算法和Kruskal(克鲁斯卡尔)算法

#include<iostream>
#include<vector>
#include <climits>using namespace std;int main() {int v, e;   // 顶点数和边数cin >> v >> e;vector<vector<int>> grid(v + 1, vector<int>(v + 1, INT_MAX));int x, y, k;    // 起点,终点和权值while (e--) {cin >> x >> y >> k;grid[x][y] = k;grid[y][x] = k;   // 无向图}// Prim算法部分vector<int> minDist(v + 1, INT_MAX);        // 所有节点到最小生成树的最小距离vector<bool> isInTree(v + 1, false);        // 是否已经在最小生成树中minDist[1] = 0;                             // 从第1个节点开始int result = 0;for (int i = 1; i <= v; i++) {int cur = -1;int minVal = INT_MAX;// 找到距离当前生成树最近的节点for (int j = 1; j <= v; j++) {if (!isInTree[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}// 如果没有找到合适的节点,则图不连通if (cur == -1) {cout << "Graph is not connected" << endl;return -1;}isInTree[cur] = true;result += minVal;  // 把该点与生成树相连的最小边的权值加入结果// 更新其他节点到生成树的最短距离for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] != INT_MAX && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}// 输出最小生成树的权重cout << result << endl;return 0;
}

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

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

相关文章

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展&#xff0c;DApp&#xff08;去中心化应用&#xff09;正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础&#xff0c;结合智能合约&#xff0c;逐步改变传统商业运作模式&#xff0c;创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

找不到包的老版本???scikit-learn,numpy,scipy等等!!

废话不多说 直接上链接了&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/xxx/ 后面的这个xxx就是包的名字 大家需要什么包的版本&#xff0c;直接输进去就可以啦 举个栗子&#…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…

9. JSON RPC 服务

① JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。 ② 在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。 一、服务中心 目前 Hyperf 仅支持两种服务中心的组件支持: consul、nacosconsul 安…

了解 .NET 8 中的定时任务或后台服务:IHostedService 和 BackgroundService

IHostedService.NET 8 引入了使用和管理后台任务的强大功能BackgroundService。这些服务使长时间运行的操作&#xff08;例如计划任务、后台处理和定期维护任务&#xff09;可以无缝集成到您的应用程序中。本文探讨了这些新功能&#xff0c;并提供了实际示例来帮助您入门。您可…

Visual Studio配置tinyfiledialogs

下载地址&#xff1a;github下载链接 将下载的文件解压后&#xff0c;打开VS添加现有项 将.c文件添加进去 然后将tinyfiledialogs.h文件路径添加到包含目录 使用时包含头文件即可&#xff1a; #include <tinyfiledialogs.h>

上海亚商投顾:沪指缩量震荡 风电、传媒股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天缩量震荡&#xff0c;三大指数集体收涨&#xff0c;北证50则跌超7%&#xff0c;超80只北交所个股跌逾…

一文搞定图

图 图 常见类型与术语 图的表示 邻接矩阵 邻接表 基础操作 基于邻接矩阵的实现 基于邻接表的实现 遍历 广度优先 深度优先 图 图 是一种非线性数据结构&#xff0c;由 顶点 和 边 组成。 相较于线性关系的链表和分治关系的树&#xff0c;网络关系的图自由度更高 常见…

初探Vue前端框架

文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…

实战-任意文件下载

实战-任意文件下载 1、开局 开局一个弱口令&#xff0c;正常来讲我们一般是弱口令或者sql&#xff0c;或者未授权 那么这次运气比较好&#xff0c;直接弱口令进去了 直接访问看看有没有功能点&#xff0c;正常做测试我们一定要先找功能点 发现一个文件上传点&#xff0c;不…

Find My平板键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

‌平板键盘的主要用途包括提高输入效率、支持轻量化办公、提供丰富的文本编辑功能以及快捷操作。相比于直接在屏幕上打字&#xff0c;使用键盘可以显著提升输入速度&#xff0c;减少输入错误&#xff0c;特别是对于需要大量文字输入的场景&#xff0c;如写作、记录笔记等‌。平…

擎创科技声明

近日&#xff0c;我司陆续接到求职者反映&#xff0c;有自称是擎创科技招聘人员&#xff0c;冒用“上海擎创信息技术有限公司”名义&#xff0c;用“126.com”的邮箱向求职者发布招聘信息&#xff0c;要求用户下载注册APP&#xff0c;进行在线测评。 对此&#xff0c;我司郑重…

使用 Flask 实现简单的登录注册功能

目录 1. 引言 2. 环境准备 3. 数据库设置 4. Flask 应用基本配置 5. 实现用户注册 6. 实现用户登录 7. 路由配置 8. 创建前端页面 9. 结论 1. 引言 在这篇文章中&#xff0c;我们将使用 Flask 框架创建一个简单的登录和注册系统。Flask 是一个轻量级的 Python Web 框架…

web网站搭建(静态)

准备工作&#xff1a; 关闭防火墙&#xff1a; [rootlocalhost ~]# systemctl disable --now firewalld 修改enforce为permissive [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# geten getenforce getent [rootlocalhost ~]# getenforce Permissive 重启服务 [rootloca…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…

网络搜索引擎Shodan(1)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shodan(1)_哔哩哔哩_bilibili 本文主要讲解网络搜索引擎Shodan的一些用法&#xff08;host和search这两个命令&#xff09;。 Shodan 是一个网络…

智创 AI 新视界 -- 探秘 AIGC 中的生成对抗网络(GAN)应用

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…

docker 单节点arm架构服务器安装zookeeper、kafka并测试通信

kafka、zookeeper常用镜像介绍 kafka和zookeeper常见的镜像有以下三个&#xff1a;wurstmeister/zookeeper、kafka、confluentinc/cp-zookeeper、cp-kafka 和 bitnami/zookeeper、kafka。 wurstmeister/xxx: 由wurstmeister团队维护&#xff0c;提供的镜像适用于开发和测试环…