2023年第八届团队程序设计天梯赛选拔校赛(三)题解_2023天梯赛题目

img
img

既有适合小白学习的零基础资料,也有适合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)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值