【图论】有向图的强连通分量

算法提高课笔记

文章目录

  • 理论基础
    • SCC板子
  • 例题
    • 受欢迎的牛
      • 题意
      • 思路
      • 代码
    • 学校网络
      • 题意
      • 思路
      • 代码
    • 最大半连通子图
      • 题意
      • 思路
      • 代码
    • 银河
      • 题意
      • 思路
      • 代码

理论基础

什么是连通分量?

对于一个有向图,分量中任意两点u,v,必然可以从u走到v,且从v走到u,这样的分量叫做连通分量

如果一个连通分量加上任意一个点都不是连通分量了,就把它叫做 强连通分量

强连通分量的主要作用:将任意一个有向图转化成一个有向无环图即拓扑图(通过缩点的方式),缩点就是将所有连通分量缩成一个点

如何求强连通分量呢?

按照DFS的顺序搜,我们可以将边分为以下四类:

  1. 树枝边:(x, y),x是y的父结点
  2. 前向边:(x, y),x是y的祖先结点
  3. 后向边:(x, y),y是x的祖先结点
  4. 横叉边:往之前搜过的其他点搜
    在这里插入图片描述
    怎么判断一个点是否在强连通分量中?
  • 情况一:存在后向边指向祖先结点
  • 情况二:先走到横叉边,横叉边再走到祖先结点

(反正一定可以走到某个祖先)

基于这个想法—— Tarjan 算法求强连通分量(SCC)

先给每个结点按照 DFS 访问顺序确定一个时间戳,时间戳越小说明越先访问到

dfn[u]:遍历到 u 的时间戳
low[u]:从 u 开始走,能遍历到的最小时间戳
id[i]:i 所在连通分量的编号

u是其所在强连通分量的最高点 <-> dfb[u] == low[u]

SCC板子

void tarjan(int u)
{dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = h[u]; ~i; i = ne[i]){int j = e[i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号} while (y != u); // 直到取到此连通分量的最高点为止}
}

缩点的步骤:

  1. 遍历所有点 i
  2. 遍历 i 的所有邻点 j
  3. 如果 i 和 j 不在同一个连通分量中,就加一条新边 id[i]->id[j]
for (int i = 1; i <= n; i ++ )for (int j = h[i]; ~j; j = ne[j]){int k = e[j]; // 遍历i的所有邻点kint a = id[i], b = id[k]; // 记录ik所在连通分量编号if (a != b) dout[a] ++ ; // 如果ik不在同一个连通分量 就在两个连通分量之间连一条i指向k的边}

做完tarjon后,连通分量编号递减的顺序一定就是拓扑序

例题

受欢迎的牛

原题链接

每一头牛的愿望就是变成一头最受欢迎的牛。

现在有 N 头牛,编号从 1 到 N,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。

这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。

你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。

输入格式

第一行两个数 N,M;

接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。

输出格式

输出被除自己之外的所有牛认为是受欢迎的牛的数量。

数据范围

1 ≤ N ≤ 104 , 1≤N≤104, 1N104,
1 ≤ M ≤ 5 × 104 1≤M≤5×104 1M5×104

输入样例

3 3
1 2
2 1
2 3

输出样例

1

样例解释

只有第三头牛被除自己之外的所有牛认为是受欢迎的。

题意

一头牛会欢迎另一头牛,这种欢迎是有传递性的,现给出多对欢迎关系,问有几头牛是被其余所有牛欢迎的

思路

先对连通分量进行缩点操作

之后分析,如果有唯一一个连通分量满足出度为0,那么这个连通分量内的所有点都可以由其余任意点到达,答案就是这个连通分量内点的个数,如果这样的连通分量超过一个就不满足条件

代码

#include <bits/stdc++.h>using namespace std;const int  N = 10010, M = 50010;int n, m;
int h[N], ne[M], e[M], idx;
int dfn[N], low[N], timestamp;
stack<int> stk;
bool in_stk[N]; // 存储点是否入栈
int id[N], scc_cnt, Size[N];
int dout[N]; // 连通分量的出度void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}void tarjan(int u)
{dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = h[u]; ~i; i = ne[i]){int j = e[i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号Size[scc_cnt] ++ ; // 更新此连通分量中的点个数} while (y != u); // 直到取到此连通分量的最高点为止}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;memset(h, -1, sizeof h);while (m -- ){int a, b;cin >> a >> b;add(a, b);}for (int i = 1; i <= n; i ++ )if (!dfn[i]) tarjan(i);for (int i = 1; i <= n; i ++ )for (int j = h[i]; ~j; j = ne[j]){int k = e[j]; // 遍历i的所有邻点kint a = id[i], b = id[k]; // 记录ik所在连通分量编号if (a != b) dout[a] ++ ; // 如果ik不在同一个连通分量 就在两个连通分量之间连一条i指向k的边}int zeros = 0, sum = 0;for (int i = 1; i <= scc_cnt; i ++ )if (!dout[i]) // 如果当前连通分量出度为0{zeros ++ ; // 出度为0的连通分量个数加一sum += Size[i]; // 更新出度为0的连通分量中点的个数if (zeros > 1) // 如果出度为0的连通分量个数超过一个 说明没有一头牛被所有牛喜欢{sum = 0;break;}}cout << sum << '\n';
}

学校网络

原题链接

一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 A 支援学校 B,并不表示学校 B 一定要支援学校 A)。

当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。

因此,一个新软件若想让所有学校都能使用,只需将其提供给一些学校即可。

现在请问最少需要将一个新软件直接提供给多少个学校,才能使软件能够通过网络被传送到所有学校?

最少需要添加几条新的支援关系,使得将一个新软件提供给任何一个学校,其他所有学校就都可以通过网络获得该软件?

输入格式

第 1 行包含整数 N,表示学校数量。

第 2…N+1 行,每行包含一个或多个整数,第 i+1 行表示学校 i 应该支援的学校名单,每行最后都有一个 0 表示名单结束(只有一个 0 即表示该学校没有需要支援的学校)。

输出格式

输出两个问题的结果,每个结果占一行。

数据范围

2 ≤ N ≤ 100 2≤N≤100 2N100

输入样例

5
2 4 3 0
4 5 0
0
0
1 0

输出样例

1
2

题意

给出一张图:

  • 问题一:至少从多少个点出发能够遍历完图上所有点
  • 问题二:至少加多少条边能让图的强连通分量就是自身

思路

设入度为0的连通分量个数为a,出度为0的连通分量个数为b

问题一就是问a的大小

问题二就是问ab中较大的值(需要特判一下如果只有一个强连通分量,就不需要加边,输出0即可 )
举个栗子 不具体证明了:在这里插入图片描述

代码

#include <bits/stdc++.h>using namespace std;const int  N = 110, M = 10010;int n, m;
int h[N], ne[M], e[M], idx;
int dfn[N], low[N], timestamp;
stack<int> stk;
bool in_stk[N]; // 存储点是否入栈
int id[N], scc_cnt;
int din[N], dout[N]; // 连通分量的入度和出度void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}void tarjan(int u)
{dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = h[u]; ~i; i = ne[i]){int j = e[i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号} while (y != u); // 直到取到此连通分量的最高点为止}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;memset(h, -1, sizeof h);for (int i = 1; i <= n; i ++ ) // 建图{int t;while (cin >> t, t) add(i, t);}for (int i = 1; i <= n; i ++ )if (!dfn[i]) tarjan(i);for (int i = 1; i <= n; i ++ )for (int j = h[i]; ~j; j = ne[j]){int k = e[j]; // 遍历i的所有邻点kint a = id[i], b = id[k]; // 记录ik所在连通分量编号if (a != b) // 如果ik不在同一个连通分量 就在两个连通分量之间连一条i指向k的边{dout[a] ++ ;din[b] ++ ;}}int a = 0, b = 0;for (int i = 1; i <= scc_cnt; i ++ ){if (!din[i]) a ++ ; // 记录入度为0的点个数if (!dout[i]) b ++ ; // 记录出度为0的点个数}cout << a << '\n';if (scc_cnt == 1) cout << 0 << '\n';else cout << max(a, b) << '\n';
}

最大半连通子图

原题链接

一个有向图 G=(V,E) 称为半连通的 (Semi-Connected),如果满足:∀u,v∈V,满足 u→v 或 v→u,即对于图中任意两点 u,v,存在一条 u 到 v 的有向路径或者从 v 到 u 的有向路径。

若 G′=(V′,E′) 满足,E′ 是 E 中所有和 V′ 有关的边,则称 G′ 是 G 的一个导出子图。

若 G′ 是 G 的导出子图,且 G′ 半连通,则称 G′ 为 G 的半连通子图。

若 G′ 是 G 所有半连通子图中包含节点数最多的,则称 G′ 是 G 的最大半连通子图。

给定一个有向图 G,请求出 G 的最大半连通子图拥有的节点数 K,以及不同的最大半连通子图的数目 C。

由于 C 可能比较大,仅要求输出 C 对 X 的余数。

输入格式

第一行包含三个整数 N,M,X。N,M 分别表示图 G 的点数与边数,X 的意义如上文所述;

接下来 M 行,每行两个正整数 a,b,表示一条有向边 (a,b)。

图中的每个点将编号为 1 到 N,保证输入中同一个 (a,b) 不会出现两次。

输出格式

应包含两行。

第一行包含一个整数 K,第二行包含整数 C mod X。

数据范围

1 ≤ N ≤ 105 , 1≤N≤105, 1N105,
1 ≤ M ≤ 106 , 1≤M≤106, 1M106,
1 ≤ X ≤ 108 1≤X≤108 1X108

输入样例

6 6 20070603
1 2
2 1
1 3
2 4
5 6
6 4

输出样例

3
3

题意

找出最大的半连通子图,输出节点数和子图个数

思路

最大半连通子图就是图上最长的一条链,所以按照以下思路:

  1. tarjan
  2. 缩点、建图、给边判重
  3. 按拓扑序递推

代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int  N = 100010, M = 2000010;int n, m, mod;
int h[N], hs[N], ne[M], e[M], idx;
int dfn[N], low[N], timestamp;
stack<int> stk;
bool in_stk[N]; // 存储点是否入栈
int id[N], scc_cnt, scc_size[N];
int f[N], g[N]; // 连通分量的入度和出度void add(int h[], int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}void tarjan(int u)
{dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = h[u]; ~i; i = ne[i]){int j = e[i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号scc_size[scc_cnt] ++ ;} while (y != u); // 直到取到此连通分量的最高点为止}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);cin >> n >> m >> mod;while (m -- ){int a, b;cin >> a >> b;add(h, a, b);}for (int i = 1; i <= n; i ++ )if (!dfn[i]) tarjan(i);unordered_set<ll> S;for (int i = 1; i <= n; i ++ )for (int j = h[i]; ~j; j = ne[j]){int k = e[j]; // 遍历i的所有邻点kint a = id[i], b = id[k]; // 记录ik所在连通分量编号ll hash = a * 1000000ll + b;if (a != b && !S.count(hash)) // 如果ik不在同一个连通分量 就在两个连通分量之间连一条i指向k的边{add(hs, a, b);S.insert(hash);}}for (int i = scc_cnt; i; i -- ){if (!f[i]) // 起点{f[i] = scc_size[i]; // 更新最大半连通子图内元素个数g[i] = 1; // 更新最大半连通子图个数}for (int j = hs[i]; ~j; j = ne[j]){int k = e[j];if (f[k] < f[i] + scc_size[k]) // 有更优解{f[k] = f[i] + scc_size[k];g[k] = g[i];}else if (f[k] == f[i] + scc_size[k]) // 有结果一样的解g[k] = (g[k] + g[i]) % mod;}}int maxf = 0, sum = 0;for (int i = 1; i <= scc_cnt; i ++ )if (f[i] > maxf){maxf = f[i];sum = g[i];}else if (f[i] == maxf) sum = (sum + g[i]) % mod;cout << maxf << '\n';cout << sum << '\n';
}

银河

原题链接

银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星。

我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 1。

现在对于 N 颗我们关注的恒星,有 M 对亮度之间的相对关系已经判明。

你的任务就是求出这 N 颗恒星的亮度值总和至少有多大。

输入格式

第一行给出两个整数 N 和 M。

之后 M 行,每行三个整数 T,A,B,表示一对恒星 (A,B) 之间的亮度关系。恒星的编号从 1 开始。

  • 如果 T=1,说明 A 和 B 亮度相等。
  • 如果 T=2,说明 A 的亮度小于 B 的亮度。
  • 如果 T=3,说明 A 的亮度不小于 B 的亮度。
  • 如果 T=4,说明 A 的亮度大于 B 的亮度。
  • 如果 T=5,说明 A 的亮度不大于 B 的亮度。

输出格式

输出一个整数表示结果。

若无解,则输出 −1。

数据范围

N ≤ 100000 , M ≤ 100000 N≤100000,M≤100000 N100000,M100000

输入样例

5 7 
1 1 2 
2 3 2 
4 4 1 
3 4 5 
5 4 5 
2 3 5 
4 5 1 

输出样例

11

题意

求图中有无正环的问题

思路

  1. 用tarjan求强连通分量
  2. 缩点、根据差分约束建图
  3. 依据拓扑序递推

代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int  N = 100010, M = 600010;int n, m;
int h[N], hs[N], w[M], ne[M], e[M], idx;
int dfn[N], low[N], timestamp;
stack<int> stk;
bool in_stk[N]; // 存储点是否入栈
int id[N], scc_cnt, scc_size[N];
int dist[N]; // 连通分量的入度和出度void add(int h[], int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}void tarjan(int u)
{dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = h[u]; ~i; i = ne[i]){int j = e[i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号scc_size[scc_cnt] ++ ;} while (y != u); // 直到取到此连通分量的最高点为止}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);cin >> n >> m;for (int i = 1; i <= n; i ++ ) add(h, 0, i, 1);while (m -- ){int t, a, b;cin >> t >> a >> b;if (t == 1) add(h, b, a, 0), add(h, a, b, 0);else if (t == 2) add(h, a, b, 1);else if (t == 3) add(h, b, a, 0);else if (t == 4) add(h, b, a, 1);else add(h, a, b, 0);}tarjan(0);bool success = true;for (int i = 0; i <= n; i ++ ){for (int j = h[i]; ~j; j = ne[j]){int k = e[j]; // 遍历i的所有邻点kint a = id[i], b = id[k]; // 记录ik所在连通分量编号if (a == b) // ik在同一个强连通分量{if (w[j] > 0) // ik间有权值为正的路径{success = false; // 无解break;}}else add(hs, a, b, w[j]);// 如果ik不在同一个连通分量 就在两个连通分量之间连一条i指向k的边}if (!success) break;}if (!success) cout << "-1\n";else // 有解则求最长路{for (int i = scc_cnt; i; i -- ){for (int j = hs[i]; ~j; j = ne[j]){int k = e[j];dist[k] = max(dist[k], dist[i] + w[j]);}}ll res = 0;for (int i = 1; i <= scc_cnt; i ++ ) res += (ll)dist[i] * scc_size[i];cout << res << '\n';}
}

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

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

相关文章

Web安全与攻防

Web安全概述 在Internet大众化及Web技术飞速演变的今天&#xff0c;在线安全所面临的挑战日益严峻。伴随着在线信息和服务的可用性的提升&#xff0c;以及基于Web的攻击和破坏的增长&#xff0c;安全风险达到了前所未有的高度。Web安全可以从以下三个方面进行考虑&#xff1a;…

Jmeter系列-控制器Controllers的介绍(8)

Controllers 简介 JMeter是一款功能强大的性能测试工具&#xff0c;而控制器是JMeter中非常重要的一个组件。控制器用于控制测试计划的执行流程&#xff0c;可以根据需求来控制线程的启动、停止、循环等操作。 Jmeter有两种类型的控制器&#xff1a;Samplers&#xff08;取样…

【Linux】动静态库

目录 1.静态库2.动态库3.静态库的使用区别总结 1.静态库 我们在linux中已经帮我们下载好了C和C所需要的各种库&#xff0c;库也是文件&#xff0c;实际上就是各种接口的实现&#xff0c;我们在使用系统提供的譬如printf等函数时&#xff0c;就是使用系统中的库文件。使用一个库…

驱动开发,IO多路复用实现过程,epoll方式

1.框架图 被称为当前时代最好用的io多路复用方式&#xff1b; 核心操作&#xff1a;一棵树&#xff08;红黑树&#xff09;、一张表&#xff08;内核链表&#xff09;以及三个接口&#xff1b; 思想&#xff1a;&#xff08;fd代表文件描述符&#xff09; epoll要把检测的事件…

Vue Router入门:为Vue.js应用添加导航

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【Unity】ShaderGraph应用(浮动气泡)

【Unity】ShaderGraph应用(浮动气泡) 实现效果 一、实现的方法 1.使用节点介绍 Position&#xff1a;获取模型的顶点坐标 Simple Noise:简单的噪声&#xff0c;用于计算顶点抖动 Fresnel Effect&#xff1a;菲涅耳效应&#xff0c;用于实现气泡效果 计算用节点 Add&…

jmeter生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

XSS入门 XSS Challenges

level1(直接注入) <script>alert(xss)</script>level2(双引号闭合标签) 测试 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT>发现<>"被转换&#xff0c;构造新的语句 "><script>alert(/xss/)</…

Keepalived 高可用(附带配置实例,联动Nginx和LVS)

Keepalived 一、Keepalived相关知识点概述1.1 单服务的风险&#xff08;单点故障问题&#xff09;1.2 一个合格的集群应该具备的特性1.3 VRRP虚拟路由冗余协议1.4 健康检查1.5 ”脑裂“现象 二、Keepalived2.1 Keepalived是什么&#xff1f;2.2 Keepalived体系主要模块及其作用…

任意文件下载

原理&#xff1a; 文件查看或文件下载功能&#xff0c;不做限制&#xff0c;恶意用户就能够查看或下载任意敏感文件&#xff0c;这就是文件查看与下载漏洞。 一般链接形式: download.php?path down.php?file data.php?file download.php?filename 或者包含参数: &Sr…

数据结构:树的概念和结构

文章目录 1. 树的概念2. 树的结构3. 树的相关概念4. 树的表示孩子表示法双亲表示法孩子兄弟表示法 5. 树在实际中的应用 1. 树的概念 树是一种非线性的数据结构,它是由 n (n > 0)个有限结点组成一个具有层次关系的. 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝…

.360勒索病毒和.halo勒索病毒数据恢复|金蝶、用友、ERP等数据恢复

导言&#xff1a; 随着数字化时代的持续发展&#xff0c;网络安全威胁也变得前所未有地复杂和难以应对。在这个充满挑战的网络环境中&#xff0c;勒索病毒已经成为了一种极为危险和破坏性的威胁。最近引起广泛关注的是.360勒索病毒&#xff0c;一种可怕的恶意软件&#xff0c;…

Python实现自主售卖机

1 问题 在python中我们常常使用到条件判断&#xff0c;if语句时常见的条件判断语句之一。那么如何使用if语句实现根据情况自动选择商品进行售卖呢&#xff1f; 2 方法 根据if语句执行时从上往下执行的特点&#xff0c;使用if语句、dict和list来实现整个流程。 代码清单 1 drink…

mysql 快速上传数据

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的&#xff0c;数据要整理成和表格一致&#xff0c;也就是说每条数据都是完整的一条&#xff0c;而不是一部分。 下面的示例我以***为分割符划分字段&#xff0c;以 \n来分割每条数据。 LO…

python连接mysql数据库的练习

一、导入pandas内置的sqlite3模块&#xff0c;连接的信息&#xff1a;ip地址是本机, 端口号port 是3306, 用户user是root, 密码password是123456, 数据库database是lambda-xiaozhang import pymysql# 打开数据库连接&#xff0c;参数1&#xff1a;主机名或IP&#xff1b;参数…

回顾多线程

1.线程有几种状态 public enum State {//新生NEW,//运行RUNNABLE,//阻塞BLOCKED,//等待WAITING,//超时等待TIMED_WAITING,//终止TERMINATED;} 2.wait和sleep的区别 1.来自不同的类 wait>Object类 sleep > Thread类 2.关于锁的释放 wait 会释放锁&#xff0c; s…

基于 Flink CDC 高效构建入湖通道

本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人&#xff0c; Apache Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; Flink CDC 核心技术解析数…

Databend 开源周报第 110 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用 BendSQL 管…

uniapp微信小程序地图实现周边

官方说明&#xff1a;小程序JavascriptSDK使用指南 - 微信小程序解决方案 | 腾讯位置服务https://lbs.qq.com/product/miniapp/jssdk/ 先申请腾讯地图的开发者密钥&#xff0c;申请地址&#xff1a;腾讯位置服务 - 立足生态&#xff0c;连接未来 申请密钥时&#xff0c;需要勾…

USB接口针式打印机

1 针式打印机原理 - 针式打印机16针是纵向排列&#xff0c;每次打印垂直的16bit&#xff0c;然后右移一bit&#xff0c;继续下列打印&#xff1b;字节的MSB表示最上面的点&#xff0c;字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的&#xff0c;而提供给打印头的信息…