算法分析与设计编程题 贪心算法

活动安排问题

题目描述

在这里插入图片描述
在这里插入图片描述

解题代码

vector<bool> greedySelector(vector<vector<int>>& intervals) {int n = intervals.size();// 将活动区间按结束时间的从小到大排序auto cmp = [](vector<int>& interval1, vector<int>& interval2) {return interval1[1] < interval2[1];};sort(intervals.begin(), intervals.end(), cmp);vector<bool> res(n, false);// 结束时间最早的活动必定位于某个最优解之中int minStart = intervals[0][1];res[0] = true;for (int i = 1; i < n; ++i) {if (intervals[i][0] >= minStart) { // 将不重叠的活动加入最优解集res[i] = true;minStart = intervals[i][1];}}return res;
}

最优装载

题目描述

在这里插入图片描述

解题代码

vector<bool> optimisedLoading(vector<int>& weight, int c) {int n = weight.size();vector<bool> select(n, false);// 定义一个小顶优先队列,使得对于i,若其weight[i]最小,则排在队列的队头priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;for (int i = 0; i < n; ++i) {// 构建二元组<重量,下标>并放入优先队列q.emplace(weight[i], i);}for (int i = 0; i < n; ++i) {auto [w, idx] = q.top(); // (C++17语法)取队头元素的w和对应下标q.pop();if (c < w) break; // 无法继续装载select[idx] = true; // 选择装载该货物c -= w; // 剩余载货量减少}return select;
}

哈夫曼编码

题目描述

在这里插入图片描述
在这里插入图片描述

解题代码

struct HuffmanNode {int left, right; // 左右结点int parent; // 父结点int weight; // 权重char data; // 数据HuffmanNode(int left = -1, int right = -1, int parent = -1, int weight = 0, char data = '*'): left(left), right(right), parent(parent), weight(weight), data(data) {}
};vector<HuffmanNode> createHuffmanTree(vector<int>& weight, vector<char>& data) {int n = weight.size();vector<HuffmanNode> huffmanTree(2 * n);// 定义一个小顶优先队列,使得对于i,若其weight[i]最小,则排在队列的队头priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;for (int i = 0; i < n; ++i) { // 初始化哈夫曼树和优先队列huffmanTree[i].data = data[i];huffmanTree[i].weight = weight[i];q.emplace(weight[i], i);}for (int i = 0; i < n - 1; ++i) {auto [weight1, idx1] = q.top(); // 取权值最小结点q.pop();auto [weight2, idx2] = q.top(); // 取权值第二小结点q.pop();// 创建两结点的父结点,其下标为n+ihuffmanTree[idx1].parent = n + i;huffmanTree[idx2].parent = n + i;// 初始化该父结点的相关信息huffmanTree[n + i].left = idx1;huffmanTree[n + i].right = idx2;huffmanTree[n + i].weight = weight1 + weight2;// 将该父结点的<权值,下标>加入优先队列,以便进行贪心选择q.emplace(weight1 + weight2, n + i);}return huffmanTree;
}void printHuffmanCode(vector<HuffmanNode>& huffmanTree) {stack<int> s;for (int i = 0; i < huffmanTree.size() / 2; ++i) {int cur = i; // 当前结点下标int pre = huffmanTree[cur].parent; // 当前结点的父结点的下标while (pre != -1) {if (huffmanTree[pre].left == cur) {s.emplace(0); // 当前结点为其父结点的左孩子}else {s.emplace(1); // 当前结点为其父结点的右孩子}// 轮换下标cur = pre;pre = huffmanTree[cur].parent;}// 打印相应的哈夫曼编码cout << huffmanTree[i].data << " ";while (!s.empty()) {cout << s.top();s.pop();}cout << endl;}
}

单源最短路径

题目描述

在这里插入图片描述

解题代码

图的定义

struct MGraph {vector<char> vertices; // 顶点数组vector<vector<int>> edges; // 邻接矩阵
};

BellmanFord

此算法可适用于含有负权值边的图。

// G:图	start:源点	dist:最短路径
bool BellmanFord(MGraph& G, int start, vector<int>& dist) {int n = G.vertices.size();// 初始化最短路径dist.assign(n, INT32_MAX);for (int j = 0; j < n; ++j) {dist[j] = G.edges[start][j];}for (int t = 0; t < n - 1; ++t) { // 松弛次数tfor (int i = 0; i < n; ++i) { // 边的起点ifor (int j = 0; j < n; ++j) { // 边的终点jif (G.edges[i][j] != INT32_MAX && dist[i] != INT32_MAX&& dist[i] + G.edges[i][j] < dist[j]) {dist[j] = dist[i] + G.edges[i][j]; // 松弛操作}}}}for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {// 若执行完算法后仍然存在非最短路径,则该图存在权值为负的环路,无最短路径if (G.edges[i][j] != INT32_MAX && dist[i] != INT32_MAX&& dist[i] + G.edges[i][j] < dist[j]) {return false;}}}return true;
}

Dijkstra

本算法仅适用于所有边的权值均为正的图。

// G:图	start:源点	dist:最短路径
void Dijkstra(MGraph& G, int start, vector<int>& dist) {int n = G.vertices.size();// 初始化最短路径dist.assign(n, INT32_MAX);vector<int> pre(n, -1); // 前驱数组vector<bool> visited(n, false); // 访问集,表示对应顶点最短路径是否已经找到visited[start] = true;// 小顶优先队列,元素为<dist[j],j>priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;// 初始化最短路径for (int j = 0; j < n; ++j) {dist[j] = G.edges[start][j];q.emplace(dist[j], j);}while (!q.empty()) {int i = q.top().second; // 贪心选择最近结点iq.pop();visited[i] = true; // 结点i最短路径已得到for (int j = 0; j < n; ++j) { // 利用结点i进行松弛操作if (visited[j]) continue; // 结点j已得到最短路径,无需松弛if (G.edges[i][j] != INT32_MAX && dist[i] != INT32_MAX&& dist[i] + G.edges[i][j] < dist[j]) {dist[j] = dist[i] + G.edges[i][j]; // 松弛操作pre[j] = i; // 更新前驱结点q.emplace(dist[j], j); // 加入优先队列}}}// 打印源点到各结点的最短路径stack<int> s;for (int i = 0; i < n; ++i) {if (i == start) continue;if (dist[i] == INT32_MAX) {cout << "inf" << ": " << G.vertices[start] << "->" << G.vertices[i] << endl;}else {cout << dist[i] << ": " << G.vertices[start] << "->";int x = pre[i];while (x != -1) {s.emplace(x);x = pre[x];}while (!s.empty()) {cout << G.vertices[s.top()] << "->";s.pop();}cout << G.vertices[i] << endl;}}
}

最小生成树

题目描述

在这里插入图片描述

解题代码

Kruskal

void Kruskal(MGraph& G) {int n = G.vertices.size();// 边集,元素为<权值weight,起点u,终点v>vector<tuple<int, int, int>> edges;for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (G.edges[i][j] != INT32_MAX) {// 将边加入边集edges.emplace_back(G.edges[i][j], i, j);}}}// 对边集按权值大小进行升序排序sort(edges.begin(), edges.end());// 简单并查集,father[x]存放x的父结点vector<int> father(n);// 寻找x所在集合的父结点(所在连通分量编号)auto findFather = [&](int x) {int f = father[x];while (f != x) {x = f;f = father[x];}return f;};for (int i = 0; i < n; ++i) {father[i] = i; // 初始父结点为自身}int cnt = 0; // 已找到的边个数for (int i = 0; cnt <= n - 1 && i < edges.size(); ++i) {auto [weight, u, v] = edges[i];int fu = findFather(u);int fv = findFather(v);// 若u和v父结点相同(即u和v位于一个连通分量中),若选择加入边uv,则会导致回路if (fu != fv) { cout << G.vertices[u] << " - " << G.vertices[v] << " : " << weight << endl;father[fu] = fv; // 两个连通分量合并为一个++cnt;}}
}

Prim

void Prim(MGraph& G) {int n = G.vertices.size();// minDist[i]表示结点i距离MST最近距离vector<int> minDist(n, INT32_MAX);// connected[i]表示在MST中与结点i相连的结点vector<int> connected(n, 0);// 表示结点i是否已加入MSTvector<bool> visited(n, false);visited[0] = true;for (int j = 1; j < n; ++j) {// 初始化最近距离minDist[j] = G.edges[0][j];}for (int i = 1; i < n; ++i) {// 寻找距离MST的最近结点kint minVal = INT32_MAX, k = -1;for (int j = 1; j < n; ++j) {if (!visited[j] && minDist[j] < minVal) {minVal = minDist[j];k = j;}}if (k == -1) break;// 将结点k加入MST中visited[k] = true;cout << G.vertices[connected[k]] << " - " << G.vertices[k] << " : " << minVal << endl;// 更新minDist数组和connected数组for (int j = 1; j < n; ++j) {if (!visited[j] && G.edges[k][j] < minDist[j]) {minDist[j] = G.edges[k][j];connected[j] = k;}}}
}

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

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

相关文章

YOLOv5,YOLOv8添加ASFF(自适应空间特征融合)

ASFF&#xff1a;Adaptively Spatial Feature Fusion (自适应空间特征融合) 论文来源&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection 代码地址&#xff1a;ASFF 1.背景 不同特征尺度之间的不一致性是基于特征金字塔的单阶段检测器的主要缺陷。 本文…

【VastbaseG100】 FATAL: The account has been locked.

使用VastbaseG100 数据库&#xff0c;查询数据报错。 org.postgresql.util.PSQLException: FATAL: The account has been locked. 帐户已被锁定。 解锁账户呗 ALTER ROLE doc ACCOUNT UNLOCK;ALTER ROLE 用户名 ACCOUNT UNLOCK; 修改密码 ALTER ROLE doc IDENTIFIED BY ZhangS…

Git小乌龟不弹add push commit的方法

1.关于使用Git小乌龟无法弹出Add菜单的问题 第一次使用小乌龟软件&#xff0c;发现可以正常将程序从Gitee仓库中克隆到本地&#xff0c;但是在将本地的程序上传到Gitee仓库中时&#xff0c;TortoiseGit无法弹出Add那一系列菜单&#xff0c;如下图所示&#xff1a; 2.解决方法 …

开源日报 0821:帮你修复老旧照片

这篇文章总结了几个开源项目的特点和优势。其中包括了 Python 资源列表、金融研究工具、动画精灵程序、游戏和旧照片修复项目等。这些项目提供了丰富的功能和技术支持&#xff0c;用户可以根据自己的需求进行定制和改进。总的来说&#xff0c;这些开源项目为开发者和用户提供了…

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

大数据学习1.1-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root

WebGL 用鼠标控制物体旋转

目录 鼠标控制物体旋转 如何实现物体旋转 示例程序&#xff08;RotateObject.js&#xff09; 代码详解 示例效果 鼠标控制物体旋转 有时候&#xff0c;WebGL程序需要让用户通过鼠标操作三维物体。这一节来分析示例程序RotateObject&#xff0c;该程序允许用户通过拖动&…

DC/DC开关电源学习笔记(十)Buck降压电路仿真及工程应用实例

(十)Buck降压电路仿真及工程应用实例 1. 仿真应用实例1.1 案例一1.2 案例二2. 工程应用实例2.1 数字DC/DC应用实例2.2 模拟DC/DC应用实例1. 仿真应用实例 1.1 案例一 仿真技术要求输入:输入电压30~90V,输出电压28V,输出电流最大10A,开关频率100KHz。我们按照参数极限工…

一、八大排序(sort)

文章目录 一、时间复杂度&#xff08;一&#xff09;定义&#xff1a;常数操作 二、空间复杂度&#xff08;一&#xff09;定义&#xff1a; 三、排序&#xff08;一&#xff09;选择排序1.定义2.代码3.特性 &#xff08;二&#xff09;冒泡排序1.定义2.代码3.特性 &#xff08…

雷龙CS SD NAND(贴片式TF卡)性能体验及应用

前段时间有幸得到了雷龙出品的贴片式的TF卡的芯片及转接板&#xff0c;从而对其产品进行了相应的了解和测评。 从获得的相关资料看&#xff0c;雷龙出品的贴片式芯片分为两类&#xff0c;即BOW型和AOW型&#xff0c;其中BOW型为第一代产品&#xff0c;属商业级&#xff1b;AOW…

【网络协议】Http-中

搜索引擎&#xff1a;搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息&#xff0c;在对信息进行组织和处理后&#xff0c;为用户提供检索服务&#xff0c;将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术&#xff0c;它旨在提…

简明 SQL 组合查询指南:掌握 UNION 实现数据筛选

在SQL中&#xff0c;组合查询是一种将多个SELECT查询结果合并的操作&#xff0c;通常使用UNION和UNION ALL两种方式。 UNION 用于合并多个查询结果集&#xff0c;同时去除重复的行&#xff0c;即只保留一份相同的数据。UNION ALL 也用于合并多个查询结果集&#xff0c;但不去除…

XSS跨站脚本攻击

XSS全称&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击,XSS属于客户端攻击&#xff0c;受害者最终是用户&#xff0c;在网页中嵌入客户端恶意脚本代码&#xff0c;最常用javascript语言。&#xff08;注意&#xff1a;叠成样式表CSS已经被占用所以叫XSS&#xff09…

Mac使用sz/rz

从使用体验上说,sz/rz要比scp要好得多.但Mac上使用这两个命令需要进行相应配置. sz&#xff1a;将选定的文件发送&#xff08;send&#xff09;到本地机器 rz&#xff1a;运行该命令会弹出一个文件选择窗口&#xff0c;从本地选择文件上传到Linux服务器 下载安装lrzsz brew i…

探索智能应用的基石:多模态大模型赋能文档图像处理

目录 0 写在前面1 文档图像分析新重点2 token荒&#xff1a;电子文档助力大模型3 大模型赋能智能文档分析4 文档图像大模型应用可能性4.1 专有大模型4.2 多模态模型4.3 设计思路 总结 0 写在前面 中国智能产业高峰论坛(CIIS2023)旨在为政企研学各界学者专家提供同台交流的机会…

rom修改----安卓系列机型如何内置app 如何选择so文件内置

系统内置app的需求 在与各工作室对接中操作单中&#xff0c;很多需要内置客户特定的有些app到系统里&#xff0c;这样方便客户刷入固件后直接调用。例如内置apk 去开机引导 去usb调试 默认开启usb安全设置等等。那么很多app内置有不同的反应。有的可以直接内置。有的需要加so…

基于 Socket 网络编程

基于 Socket 网络编程 前言一、基于Socket的网络通信传输&#xff08;传输层&#xff09;二、UDP 的数据报套接字编程1、UDP 套接字编程 API2、使用 UDP Socket 实现简单通信 三、TCP 流套接字编程1、TCP 流套接字编程 API2、使用 TCP Socket 实现简单通信3、使用 Tcp 协议进行…

【实战案例】技术转项目经理容易踩的坑,我都踩了

“带团队容易&#xff0c;带好团队难。” 这是身边一位项目经理近期在团队管理方面的深刻感悟。目前&#xff0c;他手上的一个项目被迫暂停了&#xff0c;项目团队也散了。下面给大家简要分享下这个项目案例。 【案例分享】 小李负责的是一个二次开发的项目&#xff0c;所涉及…

ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

python MP4视频转GIF动图

python MP4视频转GIF动图 引言一、转换代码二、PyQt界面编写2.1 效果展示2.2 源码 三、打包成可执行文件(.exe) 一个相当于原视频三倍速的GIF动图 引言 将MP4格式的视频转为GIF动图可以方便地向他人展示动画效果。GIF是网络上广泛使用的图像格式之一&#xff0c;几乎所有的网…