算法设计与分析复习--贪心(二)

文章目录

  • 上一篇
  • 哈夫曼编码
  • 单源最短路
  • 最小生成树
    • Kruskal算法
    • Prim算法
  • 多机调度问题
  • 下一篇

上一篇

算法设计与分析复习–贪心(一)

哈夫曼编码

在这里插入图片描述
在这里插入图片描述
产生这种前缀码的方式称为哈夫曼树

哈夫曼树相关习题AcWing 148. 合并果子

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 10010;int n;
priority_queue<int, vector<int>, greater<int> > heap;int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++){int x;scanf("%d", &x);heap.push(x);}int res = 0;while (heap.size() > 1){int x = 0;x += heap.top(); heap.pop();x += heap.top(); heap.pop();heap.push(x);res += x;}printf("%d", res);return 0;
}

在这里插入图片描述

单源最短路

最短路问题

Dijkstra方法
在这里插入图片描述
在这里插入图片描述

稠密图下

AcWing 849. Dijkstra求最短路 I

使用邻接矩阵来存

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 510;int g[N][N], n, m;
int dist[N];
bool st[N];int dijkstra()
{memset(dist, 0x3f, sizeof dist);dist[1] = 0;//这里不能初始化st[1]因为此时还没拓展边for (int i = 1; i < n; i ++){int t = -1;for (int j = 1; j <= n; j ++)if (!st[j] && (t == -1 || dist[j] < dist[t]))t = j;st[t] = true;//找到连接当前结点的最短的一条边了for (int j = 1; j <= n; j ++)dist[j] = min(dist[j], dist[t] + g[t][j]);//松弛操作}if (dist[n] > 0x3f3f3f3f >> 1) return -1;else return dist[n];
}int main()
{memset(g, 0x3f, sizeof g);scanf("%d%d", &n, &m);for (int i = 0; i < m; i ++){int a, b, c;scanf("%d%d%d", &a, &b, &c);g[a][b] = min(g[a][b], c);}printf("%d", dijkstra());return 0;
}

在这里插入图片描述

最小生成树

问题描述:设G = (V, E)是无向连通带权图。E中每条边(v, w)的权为c[v][w]。最小生成树问题就是要在G的所有生成树中,找到权值最小的那颗生成树。

最小生成树与二分图

up讲解

Kruskal算法

AcWing 859. Kruskal算法求最小生成树

在这里插入图片描述

从边的角度生成最小生成树,将边按照从小到大排序,并一次回放到结点集中,在进行判断是否有产生环,如果没有产生环就说明这个边的添加是可行的,直至添加n - 1个边,否则不能生成
判断是否有环产生使用并查集

适用于稀疏图,由于处理的是边的信息所以定义这个结构体

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010, M = 200010;// 边较少是稀疏图struct edge
{int a, b, c;
}e[M];int n, m, f[N];bool cmp(edge x, edge y)
{return x.c < y.c;
}int find(int x)
{if (x != f[x]) f[x] = find(f[x]);return f[x];
}void kruskal()
{sort(e, e + m, cmp);int res = 0, cnt = 0;for (int i = 0; i < m; i ++){int a = e[i].a, b = e[i].b, c = e[i].c;a = find(a), b = find(b);//并查集至少需要将两个点find一次,不如直接记下来if (a != b){f[a] = b;res += c;cnt ++;}}if (cnt < n - 1) puts("impossible");else printf("%d", res);
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++) f[i] = i; for (int i = 0; i < m; i ++) {scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].c);}kruskal();return 0;
}

在这里插入图片描述

Prim算法

AcWing 858. Prim算法求最小生成树

在这里插入图片描述
将顶点集分为已选顶点集合和未选顶点集合,然后优先选择连接两个集合的权值最小的边

适用于稠密图,用邻接矩阵存的

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 510;int g[N][N], n, m;
int dist[N];
bool st[N];void prim()
{memset(dist, 0x3f, sizeof dist);int res = 0;for (int i = 0; i < n; i ++){int t = -1;for (int j = 1; j <= n; j ++)if (!st[j] && (t == -1 || dist[j] < dist[t]))t = j;st[t] = true;//第一个结点不做处理if (i && dist[t] == 0x3f3f3f3f){// 不连通puts("impossible");return;}if (i) res += dist[t];//加权重for (int j = 1; j <= n; j ++)dist[j] = min(dist[j], g[t][j]);//和dijkstra的区别,算的不是从起点到的距离而是两个点的距离,所以不加}printf("%d", res);}int main()
{memset(g, 0x3f, sizeof g);scanf("%d%d", &n, &m);for (int i = 0; i < m; i ++){int a, b, c;scanf("%d%d%d", &a, &b, &c);g[a][b] = g[b][a] = min(g[a][b], c);//无权图两边都要}prim();return 0;
}

在这里插入图片描述

多机调度问题

设有n个独立的作业{1, 2, …,n}, 由m台相同的机器{ M 1 , M 2 , . . . , M m M_1, M_2, ..., M_m M1,M2,...,Mm}进行加工处理,作业 i i i 所需的处理时间为 t i t_i ti(1 <= i <= n),每个作业均可在任何一台机器上加工处理, 但不可间断、拆分。要求给出一种作业调度方案 ,使得n个作业在尽可能短的时间内被m个机器加工完成。

贪心策略:采取最长处理时间作业优先

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;
typedef pair<int, int> PII;const int N = 100010;int a[N], n, m;
priority_queue<PII, vector<PII>, greater<PII> > heap;bool cmp(int x, int y)
{return x > y;
}int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < n; i ++) scanf("%d", &a[i]);for (int i = 1; i <= m; i ++) heap.push({0, i});sort(a, a + n, cmp);int res = 0;for (int i = 0; i < n; i ++){auto t = heap.top();heap.pop();t.first += a[i];res = max(res, t.first);heap.push(t);}printf("%d", res);return 0;
}

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

下一篇

未完待续

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

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

相关文章

三层交换机实现不同VLAN间通讯

默认时&#xff0c;同一个VLAN中的主机才能彼此通信&#xff0c;那么交换机上的VLAN用户之间如何通信&#xff1f; 要实现VLAN之间用户的通信&#xff0c;就必须借助路由器或三层交换机来完成。 下面以三层交换机为例子说明&#xff1a; 注意&#xff1a; 1.交换机与三层交换…

CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程&#xff0c;分享如何将分布式理论应用于实际生产&#xff0c;以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…

C语言 字符函数汇总,模拟实现各字符函数(炒鸡详细)

目录 求字符串长度 strlen 示例 模拟实现strlen 长度不受限制的字符串函数 strcpy 示例 模拟实现strcpy strcat 模拟实现strcat strcmp 示例 模拟实现strcmp 长度受限制的字符串函数介绍 strncpy 示例 模拟实现strncpy strncat 示例 模拟实现strncat s…

【【VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 】】

VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒&#xff0c;下基板玻璃上设置 TFT&#xff08;薄膜晶体管&#xff09;&#xff0c;上基板玻璃上设置彩色滤光片&#xff0c;通…

ChatGPT最强?文心一言与ChatGPT对比

对于同一个问题我们分别对文心一言3.5和ChatGPT3.5输出回答&#xff0c;结果如下图&#xff0c;可以看到文心一言的回答更好&#xff0c;文心一言是由百度开发的人工智能语言模型&#xff0c;它的中文理解能力主要是基于百度强大的搜索引擎和自然语言处理技术。文心一言更加注重…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(二)

文章目录 第三章 识别CAN中的隐藏带宽信道3.1 隐蔽带宽vs.隐藏带宽3.1.1 隐蔽通道3.1.2 隐藏带宽通道 3.2 通道属性3.3 CAN隐藏带宽信道3.3.1 CAN帧ID字段3.3.2 CAN帧数据字段3.3.3 帧错误检测领域3.3.4 时间通道3.3.5 混合通道 3.4 构建信道带宽公式3.5通道矩阵3.6 结论 第四章…

2024全网最新最全的Pytest接口自动化测试框架教程

pytest编写的规则&#xff1a; 1、测试文件以test_开头&#xff08;以_test结尾也可以&#xff09; 2、测试类以Test开头&#xff0c;并且不能带有__init__方法 3、测试函数以test_开头 4、断言必须使用assert pytest.main([-s,-v]) &#xff1a;用来执行测试用例 -s 打印prin…

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

基于Netty实现的简单聊天服务组件

目录 基于Netty实现的简单聊天服务组件效果展示技术选型&#xff1a;功能分析聊天服务基础设施配置&#xff08;基于Netty&#xff09;定义组件基础的配置&#xff08;ChatProperties&#xff09;定义聊天服务类&#xff08;ChatServer&#xff09;定义聊天服务配置初始化类&am…

慢日志查询

概述 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过 long_query_time 值的SQL&#xff0c;则会被记录到慢查询日志中&#xff0c;ong_query_time 的默认值为 10&#xff0c;意思是运行10S…

Linux系统之lsof命令的基本使用

Linux系统之lsof命令的基本使用 一、lsof命令的基本使用二、lsof命令的使用帮助2.1 lsof命令的help帮助信息2.2 lsof命令帮助解释 三、lsof的基本使用3.1 直接使用lsof命令3.2 查看某个进程打开的所有文件3.3 查看某个用户打开的所有文件3.4 查看某个文件被哪些进程打开3.5 查看…

openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库

文章目录 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库127.1 前提条件127.2 背景信息127.3 操作步骤 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库 127.1 前提条件 系统中需要有审计管理员或者具有审计管理员权…