C++U6-12-阶段复习测评

news/发布时间2024/5/9 9:14:36

 

 

 

 

 

 

7、贝尔曼福特算法,是按顺序一轮一轮的松弛,如果有可以松弛的那就再来一轮;这个题第二轮就没有可以松弛的了,所以就没有第3轮了

 

8、这题是dijkstra算法,算法逻辑是:

Dijkstra 最短路径算法的步骤如下:
  1. 初始化:创建一个距离数组 dist,用于存储起点到每个节点的初始估计距离,将其初始化为无穷大;创建一个前驱节点数组 pred,用于记录每个节点的前一个节点。
  2. 标记起点:将起点标记为已访问,并将其距离设置为 0。
  3. 选择未访问节点:从剩余未访问节点中选择距离最小的节点。
  4. 更新距离:对选择的节点,更新其邻居节点的距离值。
  5. 重复步骤 3 和 4,直到所有节点都被访问。
  6. 根据前驱节点数组 pred 回溯得到最短路径。
Dijkstra 算法通过不断选择距离最小的未访问节点,并更新其邻居节点的距离,最终找到起点到其他节点的最短路径。

 

 

 

 

 

【算法分析】
采用邻接矩阵存图,a 
i,j
​=1 表示 i 和 j 之间有边。然后每次从一个没有访问过的点开始 dfs(也可以 bfs),将所有到达的点进行标记,并同时用一个变量记录此次 dfs 访问了几个点,那么这个变量的值就是连通块的大小,取个 max 即可。【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 9;
int a[maxn][maxn];
bool vis[maxn];
int num, n, m;
void dfs(int x) {num++;vis[x] = 1;for (int i = 1; i <= n; i++) {if (a[x][i] && !vis[i]) dfs(i);}
}
int main() {cin >> n >> m;for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;a[u][v] = a[v][u] = 1;}int ans = 0;for (int i = 1; i <= n; i++) {if (!vis[i]) {num = 0;dfs(i);ans = max(ans, num);}}cout << ans;return 0;
}
View Code

 

 

[魔法]

 

 

 

 

【算法分析】
这题可以看成 n 个点,m 条边的有向图,每条边的权值是 1,求 x 到 y 的最短路径,由于 n 很小,可以使用 floyd(当然也可以使用 bfs(因为每条边的边权相同)、任何最短路径算法(题目数据范围很小))。【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2 + 9; 
int dp[maxn][maxn];
int main() {int n, m;cin >> n >> m;memset(dp, 0x3f, sizeof(dp));for (int i = 1; i <= n; i++) dp[i][i] = 0;for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;dp[u][v] = 1;}int x, y;cin >> x >> y;for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);}}}if (dp[x][y] < 0x3f3f3f3f) cout << dp[x][y];else cout << -1;return 0;
}
View Code

 

 

 

[方格取数]

 

 

【算法分析】
如果没有位置封锁,用 dp 
i,j
​表示从 (1,1) 到 (i,j) 的路径最大和,则状态转移方程为 dp 
i,j
​=max(dp 
i−1,j
​,dp 
i,j−1
​)+a 
i,j
​(a 
i,j
​表示方格 (i,j) 位置的数字)。现在考虑被封锁的情况,其实就是不能计算被封锁位置的 dp 值。最后不能到达 B,就是 dp 
i,j
​的值为 0。注意答案会爆 int。【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 9; 
long long dp[maxn][maxn];
int a[maxn][maxn];
bool vis[maxn][maxn];
int main() {int n, k;cin >> n >> k;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) cin >> a[i][j];}for (int i = 0; i < k; i++) {int x, y;cin >> x >> y;vis[x][y] = 1;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (vis[i][j]) continue;if (i == 1 && j == 1) {dp[1][1] = a[1][1];continue;}if (dp[i - 1][j] || dp[i][j - 1]) {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + a[i][j];}}}cout << dp[n][n];return 0;
}
View Code

 

 

没作业

 

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

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

相关文章

H3C配置IRF实现网络设备堆叠

网络设备虚拟化-H3C交换机堆叠配置堆叠的概述 在此之前了解一下什么是堆叠,堆叠是指将多台交换机设备通过线缆连接后组合在一起,虚拟化成一台设备,是一种横向虚拟化技术。堆叠作为一种横向虚拟化技术,将多台设备在逻辑上虚拟成一台设备,可以简化网络的配置和管理。华三的虚…

小小逻辑判断符的错误使用,资损几万块

小小逻辑判断符,资损几万块分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/故事 这是一个真实事件,三年前老猫负责公司的支付资产业务。为了响应上级号召,加强国央企之间的合作,公司新谈了一个支付对接的渠道(当然这个支付渠道其实很冷门的,也是为了对接而对接…

MySQL 函数

汇总函数 rollup rollup是 SQL 关键字,在 MySQL 中得用with rollup。它是group by子句的扩展,用于统计后增加一行汇总数据。 举例,现有库存表,我们按仓库名称分组,统计每个仓库的产品总量,最后来一个汇总。 mysql> SELECT * FROM inventory; +----+---------------+--…

《线性代数的本质》笔记(01-03)

前言: 本系列为《线性代数的本质》的笔记,作者为3Blue1Brown大神,视频的b站链接为 https://www.bilibili.com/video/BV1ys411472E/?spm_id_from=333.999.0.0&vd_source=cb7d5dd830bc59a85c459b0b14a2e685 看了这个系列视频后我受益匪浅,为了方便后续回顾所以整理成了文…

Deutsch Lernen

Hallo.贴个德语键位表。

[转帖]活久见,TCP连接互串了

https://plantegg.github.io/2020/11/18/TCP%E8%BF%9E%E6%8E%A5%E4%B8%BA%E5%95%A5%E4%BA%92%E4%B8%B2%E4%BA%86/ 背景 应用每过一段时间总是会抛出几个连接异常的错误,需要查明原因。 排查后发现是TCP连接互串了,这个案例实在是很珍惜,所以记录一下。 抓包 业务结构: 应用…