既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
if (st.size())
return "Extra left brackets";
else
return "Brackets match";
}
int main() {
mp[‘(’] = ‘)’;
mp[‘[’] = ‘]’;
mp[‘{’] = ‘}’;
cout << solve();
return 0;
}
## 7-10 列出连通集
#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 5;
vector G[N];
int vis[N];
int n, m, cnt;
void dfs(int u, int t) {
if (vis[u])
return;
vis[u] = t;
cout << u << " ";
for (int v : G[u])
dfs(v, t);
}
void bfs(int u, int t) {
queue Q;
Q.push(u);
while (!Q.empty()) {
int u = Q.front();
Q.pop();
if (vis[u])
continue;
vis[u] = t;
cout << u << " ";
for (int v : G[u])
Q.push(v);
}
}
int main() {
cin >> n >> m;
while (m–) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int u = 0; u < n; u++)
sort(G[u].begin(), G[u].end()); // 按编号递增的顺序访问邻接点
cnt = 0;
memset(vis, 0, sizeof(vis));
for (int u = 0; u < n; u++) {
if (!vis[u]) {
cout << "{ ";
dfs(u, ++cnt);
cout << "}\n";
}
}
cnt = 0;
memset(vis, 0, sizeof(vis));
for (int u = 0; u < n; u++)
if (!vis[u]) {
cout << "{ ";
bfs(u, ++cnt);
cout << "}\n";
}
}
## 7-12 哲哲打游戏
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int rec[N];
vector choice[N];
int n, m;
int now = 1;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
choice[i].resize(k + 1);
for (int j = 1; j <= k; j++)
cin >> choice[i][j];
}
for (int i = 1; i <= m; i++) {
int op, j; // op是option的缩写, not Genshin (雾
cin >> op >> j;
if (op == 0) {
now = choice[now][j]; // 转移
} else if (op == 1) {
rec[j] = now; // 存档
cout << now << endl;
} else if (op == 2) {
now = rec[j]; // 读档
}
}
cout << now;
return 0;
}
## 7-13 喊山
考试的时候想到用 Dijkstra 跑一遍最短路,把每条边权设置为1,超时了,但是运气好得了大部分分(22/25)
#include <bits/stdc++.h>
using namespace std;
using Edge = pair<int, int>;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
vector G[N];
int dist[N];
bool vis[N];
int n, m, k;
void dijkstra(int s) {
memset(vis, 0, sizeof(vis));
memset(dist, 0x3f, sizeof(dist));
dist[s] = 0;
int maxdist = 0, idx = 0;
while (true) {
int u = -1, minv = INF;
for (int i = 1; i <= n; i++)
if (minv > dist[i] && !vis[i])
u = i, minv = dist[i];
if (u == -1)
break;
vis[u] = true;
for (auto &[v, w] : G[u])
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
if (maxdist < dist[v]) {
maxdist = dist[v];
idx = v;
} else if (maxdist == dist[v])
idx = min(idx, v);
}
}
cout << idx << endl;
}
int main() {
cin >> n >> m >> k;
for (int i = 0, a, b; i < m; i++) {
cin >> a >> b;
G[a].push_back({b, 1});
G[b].push_back({a, 1});
}
for (int i = 0, t; i < k; i++) {
cin >> t;
dijkstra(t);
}
return 0;
}
考完回来想到是不是可以用堆优化的Dijkstra,交一遍然后过了
#include <bits/stdc++.h>
using namespace std;
using Edge = pair<int, int>;
using Node = pair<int, int>;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
vector G[N];
int dist[N];
int n, m, k;
void dijkstra(int s) {
memset(dist, 0x3f, sizeof(dist));
dist[s] = 0;
int maxdist = 0, idx = 0;
priority_queue<Node, vector, greater> q;
q.push({0, s});
while (!q.empty()) {
auto [dist_u, u] = q.top();
q.pop();
if (dist[u] < dist_u)
continue;
for (auto &[v, w] : G[u])
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
q.push({dist[v], v});
if (maxdist < dist[v]) {
maxdist = dist[v];
idx = v;
} else if (maxdist == dist[v])
idx = min(idx, v);
}
}
cout << idx << endl;
}
int main() {
cin >> n >> m >> k;
for (int i = 0, a, b; i < m; i++) {
cin >> a >> b;
G[a].push_back({b, 1});
G[b].push_back({a, 1});
}
for (int i = 0, t; i < k; i++) {
cin >> t;
dijkstra(t);
}
return 0;
}
后面再去看大佬的提交,发现其实BFS就能跑出来。也想起来从哪里看的,边权相同的图,跑堆优化Dijkstra自动退化成BFS了
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
vector G[N];
int dist[N];
int n, m, k;
void bfs(int s) {
memset(dist, 0x3f, sizeof(dist));
dist[s] = 0;
int maxdist = 0, idx = 0;
queue q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : G[u])
if (dist[v] == INF) {
dist[v] = dist[u] + 1;
q.push(v);
if (maxdist < dist[v]) {
maxdist = dist[v];
idx = v;
} else if (maxdist == dist[v])
idx = min(idx, v);
}
}
cout << idx << endl;
}
int main() {
cin >> n >> m >> k;
for (int i = 0, a, b; i < m; i++) {
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
for (int i = 0, t; i < k; i++) {
cin >> t;
bfs(t);
}
return 0;
}
重新看来一遍最短路专题
| 问题 | 边权 | 算法 | 时间复杂度 |
| --- | --- | --- | --- |
| 一个起点,一个终点 | 非负数;无边权(或边权为1) |
A
∗
A^\*
A∗ 算法 |
<
O
(
(
m
+
n
)
log
n
)
<O((m+n)\log n)
<O((m+n)logn) |
| | | 双向广搜 |
<
O
(
(
m
+
n
)
log
n
)
<O((m+n)\log n)
<O((m+n)logn) |
| | | 贪心最优搜索 |
<
O
(
m
+
n
)
<O(m+n)
<O(m+n) |
| 一个起点到其他所有点 | 无边权 | BFS |
O
(
m
+
n
)
O(m+n)
O(m+n) |
| | 非负数 | Dijkstra;堆优化Dijkstra |
O
(
n
2
)
O(n^2)
O(n2);
O
(
(
m
+
n
)
log
n
)
O((m+n)\log n)
O((m+n)logn) |
| | 允许有负数 | Bellman-Ford;SPFA |
<
O
(
m
n
)
<O(mn)
<O(mn) |
| 所有点对之间 | 允许有负数 | Floyd-Warshall |
O
(
n
3
)
O(n^3)
![img](https://img-blog.csdnimg.cn/img_convert/35442330f141763986dfc855da74c522.png)
![img](https://img-blog.csdnimg.cn/img_convert/2669e012d1f6c367f59dcb9529fd96e1.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
man-Ford;SPFA |
<
O
(
m
n
)
<O(mn)
<O(mn) |
| 所有点对之间 | 允许有负数 | Floyd-Warshall |
O
(
n
3
)
O(n^3)
[外链图片转存中...(img-q3AEau42-1715834241948)]
[外链图片转存中...(img-3XonO4kk-1715834241948)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**