首页 > 编程语言 >C++U6-12-阶段复习测评

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

时间:2024-04-14 13:33:06浏览次数:23  
标签:12 int U6 cin C++ 算法 maxn 节点 dp

 

 

 

 

 

 

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

 

 

没作业

 

标签:12,int,U6,cin,C++,算法,maxn,节点,dp
From: https://www.cnblogs.com/jayxuan/p/18134052

相关文章

  • Magnet DVR Examiner 3.12.0 (Windows) - 从监控系统 CCTV 和监控 DVR 恢复视频和元数
    MagnetDVRExaminer3.12.0(Windows)-从监控系统CCTV和监控DVR恢复视频和元数据DigitalForensicSoftware|DVR和CCTV恢复解决方案请访问原文链接:https://sysin.org/blog/magnet-dvr-examiner/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgMagnetDV......
  • 01_C++基础
    C++基础1.什么是c++。​c++是c语言的升级版,在c的基础上增加了很多功能。是一种高级语言。2.什么是面向对象,什么又是面向过程。​c语言就是面向过程的,c++就是面向对象的。举例:a+b​直接计算a+b就是面向过程。​面向对象就是给a+b穿上了一层衣服。不......
  • [译] .NET 8 中的硬件内在函数(支持 Wasm 和 AVX-512)
    原文链接:https://devblogs.microsoft.com/dotnet/dotnet-8-hardware-intrinsics/HardwareIntrinsicsin.NET8TannerGooding[MSFT]December11th,2023译文:.NET8中的硬件内在函数坦纳·古丁[MSFT]2023年12月11日.NET在通过JIT编译器本质上理解的API提供对附加硬件功......
  • c++ inline
    当在头文件中定义函数时,如果这个头文件被多个.cpp文件包含,那么每个包含该头文件的.cpp文件都会有一个该函数的副本。这在链接阶段会引起“多重定义”的错误,因为链接器找到多个相同符号的定义。使用inline关键字可以解决这个问题。当一个函数被声明为inline,编译器会尝试将......
  • 第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组题解
    试题A:握手问题本题总分:\(5\)分思路:组合计数,用为\(50\)个人握手的总方案数\(C^{2}_{50}\),减去七个人彼此没有握手握手的方案数\(C^{2}_{7}\)即为答案。A:握手问题#include<bits/stdc++.h>#defineintlonglong#definedblongdouble#defineall(f)f.begin()......
  • C与C++在函数和数据的比较
    C与C++在函数和数据的比较CData(struct)数据是一个类型->根据数据的类型创建出真正的数据Function函数就是用来处理数据的缺陷:语言没提供关键字.所以数据是全局的->各个函数都可以处理数据C++Data将数据和处理这些数据的函数包裹在一起,其他函数看不到其他函数处理......
  • 汇编语言简易教程(12):系统服务
    汇编语言简易教程(12):系统服务应用程序必须使用操作系统执行许多操作。此类操作包括控制台输出、键盘输入、文件服务(打开、读取、写入、关闭等)、获取时间或日期、请求内存分配等访问系统服务是应用程序请求操作系统执行某些特定操作(代表进程)的方式。更具体地说,系统调用是执......
  • 汇编语言简易教程(12):系统服务
    汇编语言简易教程(12):系统服务应用程序必须使用操作系统执行许多操作。此类操作包括控制台输出、键盘输入、文件服务(打开、读取、写入、关闭等)、获取时间或日期、请求内存分配等访问系统服务是应用程序请求操作系统执行某些特定操作(代表进程)的方式。更具体地说,系统调用是执......
  • 汇编语言简易教程(12):系统服务
    汇编语言简易教程(12):系统服务应用程序必须使用操作系统执行许多操作。此类操作包括控制台输出、键盘输入、文件服务(打开、读取、写入、关闭等)、获取时间或日期、请求内存分配等访问系统服务是应用程序请求操作系统执行某些特定操作(代表进程)的方式。更具体地说,系统调用是执......
  • 汇编语言简易教程(12):系统服务
    汇编语言简易教程(12):系统服务应用程序必须使用操作系统执行许多操作。此类操作包括控制台输出、键盘输入、文件服务(打开、读取、写入、关闭等)、获取时间或日期、请求内存分配等访问系统服务是应用程序请求操作系统执行某些特定操作(代表进程)的方式。更具体地说,系统调用是执......