【笔记】优先队列(priority_queue/set)
目录
大根堆
小根堆
set(小根堆)
大根堆
题目链接:洛谷 P3243 菜肴制作
题目描述
知名美食家小 A 被邀请至 ATM 大酒店,为其品评菜肴。ATM 酒店为小 A 准备了 n 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1 到 n 的顺序编号,预估质量最高的菜肴编号为 1。
由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有 m 条形如 i 号菜肴必须先于 j 号菜肴制作的限制,我们将这样的限制简写为 (i,j)。
现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A 能尽量先吃到质量高的菜肴:
也就是说,
-
在满足所有限制的前提下,1 号菜肴尽量优先制作。
-
在满足所有限制,1 号菜肴尽量优先制作的前提下,2 号菜肴尽量优先制作。
-
在满足所有限制,1 号和 22 号菜肴尽量优先的前提下,3 号菜肴尽量优先制作。
-
在满足所有限制,1 号和 2 号和 3 号菜肴尽量优先的前提下,4 号菜肴尽量优先制作。
-
以此类推。
例 1:共 4 道菜肴,两条限制 (3,1)、(4,1),那么制作顺序是 3,4,1,2。
例 2:共 5 道菜肴,两条限制 (5,2)、(4,3),那么制作顺序是 1,5,2,4,3。
例 1 里,首先考虑 1,因为有限制 (3,1) 和 (4,1),所以只有制作完 3 和 4 后才能制作 1,而根据 3,3 号又应尽量比 4 号优先,所以当前可确定前三道菜的制作顺序是 3,4,1;接下来考虑 2,确定最终的制作顺序是 3,4,1,2。
例 2 里,首先制作 1 是不违背限制的;接下来考虑 2 时有 (5,2) 的限制,所以接下来先制作 55 再制作 2;接下来考虑 3 时有 (4,3) 的限制,所以接下来先制作 4 再制作 3,从而最终的顺序是 1,5,2,4,3。现在你需要求出这个最优的菜肴制作顺序。无解输出 Impossible!(首字母大写,其余字母小写)
输入格式
第一行是一个正整数 t,表示数据组数。接下来是 t 组数据。对于每组数据:第一行两个用空格分开的正整数 n 和 m,分别表示菜肴数目和制作顺序限制的条目数。接下来 m 行,每行两个正整数 x,y,表示 x 号菜肴必须先于 y 号菜肴制作的限制。
输出格式
输出文件仅包含 t 行,每行 n 个整数,表示最优的菜肴制作顺序,或者 Impossible! 表示无解。
输入输出样例
输入 #1复制
3 5 4 5 4 5 3 4 2 3 2 3 3 1 2 2 3 3 1 5 2 5 2 4 3
输出 #1复制
1 5 3 4 2 Impossible! 1 5 2 4 3
说明/提示
【样例解释】
第二组数据同时要求菜肴 1 先于菜肴 2 制作,菜肴 2 先于菜肴 3 制作,菜肴 3 先于。
菜肴 1 制作,而这是无论如何也不可能满足的,从而导致无解。
【数据范围】
100% 的数据满足 n,m≤105,1≤t≤3。
m 条限制中可能存在完全相同的限制。
思想:用大根堆不用小根堆的原因,用小根堆只能找到小点,但是无法保证能先选到1在前面的点,比如4 2,5 1,那么小根堆会优先选择4 2,这样的排列顺序不符合题意,要想1出现在前面,那么可以反向建边,用大根堆,这样的排列顺序就是5 1,最后再翻转输出就可以了。
代码
// Problem: D - 菜肴制作
// Contest: Virtual Judge - 2023暑期训练-图论part1
// URL: https://vjudge.net/contest/574296#problem/D
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N = 2e5+5;int n,m;
int in[N];
vector<int> edge[N];
vector<int> ans;void toposort(){priority_queue<int> q;//q.clear();for(int i=1;i<=n;i++){if(in[i]==0){q.push(i);}}while(!q.empty()){int t=q.top();q.pop();ans.push_back(t);for(int i=0;i<edge[t].size();i++){in[edge[t][i]]--;if(in[edge[t][i]]==0){q.push(edge[t][i]);}}}if(ans.size()<n){cout<<"Impossible!"<<"\n";}else{for(int i=n-1;i>=0;i--){cout<<ans[i]<<' ';}cout<<"\n";}}int main(){int T;cin>>T;while(T--){cin>>n>>m;ans.clear();memset(in,0,N);for(int i=0;i<N;i++){edge[i].clear();}for(int i=1;i<=m;i++){int x,y;cin>>x>>y;edge[y].push_back(x);in[x]++;}toposort();}return 0; }
题目链接:代码源 最短路
给你一张 n 个顶点 m 条边的有向简单图,顶点编号从 1 到 n,每条边都有一个边权,边权为非负整数。
现在有 k 组询问,每组询问读入两个整数 x,y,请求出从 x 号点到 y 号点的最短路的长度。如果不存在从 x 号点到 y 号点的路径,请输出 -1。
输入格式
第一行三个整数 n,m,k,表示图的顶点数、边数和询问次数。
接下来 m 行,每行三个整数 x,y,z,表示 x𝑥 号点到 y 号点有一条边权为 z 的有向边。
接下来 k 行,每行两个整数 x,y,表示一组询问。
输出格式
输出共 k 行,每行一个数表示一组询问的答案。
样例输入
3 3 2
1 2 3
2 3 2
3 2 1
1 3
3 1
样例输出
5
-1
数据规模
对于所有数据,保证 2≤n≤5000,0≤m≤10000,1≤k≤5,1≤x,y≤n,1≤z≤10000。
思想:set是一种数据结构,可以维护数据按照从小到大的顺序排列
小根堆
priority_queue<pii,vector<pii>,greater<pii>> q;
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;const int N = 2e5+5;struct node{int y,v; //连接的边以及边权node(int _y,int _v){y=_y;v=_v;}
};vector<node> edge[N+1];
int dist[N+1];
int n,m,k;
priority_queue<pii,vector<pii>,greater<pii>> q;
bool st[N];void dijkstra(int s,int t){memset(dist,127,N+1);memset(st,false,N);dist[s]=0;//q.clear();for(int i=1;i<=n;i++){q.push({dist[i],i});}while(!q.empty()){int x=q.top().second;q.pop();if(st[x]) continue;st[x]=true;for(auto i:edge[x]){if(dist[x]+i.v<dist[i.y]){dist[i.y]=dist[x]+i.v;q.push({dist[i.y],i.y});}}}if(dist[t]<1<<30){cout<<dist[t]<<"\n";}else{cout<<"-1\n";}}int main(){cin>>n>>m>>k;for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;edge[x].push_back(node(y,z));}for(int i=1;i<=k;i++){int s,t;cin>>s>>t;dijkstra(s,t);}return 0; }
set(小根堆)
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;const int N = 2e5+5;struct node{int y,v; //连接的边以及边权node(int _y,int _v){y=_y;v=_v;}
};vector<node> edge[N+1];
int dist[N+1];
int n,m,k;
set<pii> se;void dijkstra(int s,int t){memset(dist,127,N+1);dist[s]=0;se.clear();for(int i=1;i<=n;i++){se.insert({dist[i],i});}while(!se.empty()){int x=se.begin()->second;if(x==t||dist[x]>1<<30){break;}se.erase(se.begin());for(auto i:edge[x]){if(dist[x]+i.v<dist[i.y]){se.erase({dist[i.y],i.y});dist[i.y]=dist[x]+i.v;se.insert({dist[i.y],i.y});}}}if(dist[t]<1<<30){cout<<dist[t]<<"\n";}else{cout<<"-1\n";}}int main(){cin>>n>>m>>k;for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;edge[x].push_back(node(y,z));}for(int i=1;i<=k;i++){int s,t;cin>>s>>t;dijkstra(s,t);}return 0; }
相关文章:
【笔记】优先队列(priority_queue/set)
目录 大根堆 小根堆 set(小根堆) 大根堆 题目链接:洛谷 P3243 菜肴制作 题目描述 知名美食家小 A 被邀请至 ATM 大酒店,为其品评菜肴。ATM 酒店为小 A 准备了 n 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1 到…...
看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案
关于线性恒流调节器(CCR):是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时,CCR会减少功率晶体管的导…...
Linux进阶之Shell-sed
基本用法: sed 选项 “指令” 文件 常用选项: -e --它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时使用 -f --后跟保存了sed指令的文件 -i --直接对内容进行修改,不加 i 时默认只是预…...
前端高频面试题 Day02
面试题 var 和 let const 的区别 var 是 ES5 及之前的语法,let const 是 ES6 语法var 和 let 是变量,可修改;const 是常量,不可修改var 有变量提升,let const 没有var 没有块级作用域,let const 有 &…...
MYSQL完全卸载、安装与账号创建、权限控制
一、卸载mysql CentOS 卸载 MySQL 1. 查看安装情况 使用以下命令查看当前安装mysql情况,查找以前是否装有mysql rpm -qa|grep -i mysql这里显示我安装的 MySQL 服务有有: 2. 停止 mysql 服务、删除之前安装的 mysql 删除命令:rpm -e –n…...
get与post如何拼接url与数据的灵活处理,循环的重要性。
get与post拼接url地址不同: let postData {method: "post",data: {op: "/api/setting/maintenanceperiod?period"this.authorizationCode,loadingConfig: {},data: {period:this.authorizationCode}}}; if(this.editData.id){let postData …...
Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现
Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI…...
Android学习之路(5) UI控件之Button (按钮)与 ImageButton (图像按钮)
本节引言: 今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和后面ImageView相同,所以本节 只对Button进行讲解&am…...
Day 31 C++ STL常用算法(下)
文章目录 常用拷贝和替换算法copy——容器内指定范围的元素拷贝到另一容器中函数原型注意——利用copy算法在拷贝时,目标容器要提前开辟空间示例 replace——将容器内指定范围的第一个旧元素修改为新元素函数原型注意——replace只会替换区间内满足条件的第一个旧元…...
【Android Studio】 win11 安装配置 jdk17 超详细
概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…...
IDEA下方工具栏SideBar没有Services解决方法 IDEA配合微服务学习多端口管理打开Services栏方法
问题 微服务学习时,一次要打开多个端口,比如8080给order模块、8081给user模块……这就需要用idea管理多端口。 这时候就可以用到Services栏进行管理。 解决 首先看下方Sidebar没有Services。 打开Services 打开方式一:手动打开 在IDEA中…...
[Vue warn]: Error in render: “SyntaxError: “undefined“ is not valid JSON“
[Vue warn]: Error in render: “SyntaxError: “undefined” is not valid JSON” 这说明出现了undefined这个变量类型,比如JSON.parse()时候会出现,可以先尝试打印JSON.parse()括号中的内容是否是undefined,如果是,那问题的根源…...
ui设计师工作总结及计划范文模板
ui设计师工作总结及计划范文模板【篇一】 白驹过隙,转眼间某某年已近结尾,时间伴随着我们的脚步急驰而去,到了个人工作总结的时候,蓦然回首,才发现过去的一年不还能画上圆满的句号,内心感慨万千,…...
【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端
目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前,需要先做点准备工作,用 IDEA 新建一个 Maven 项目,取名 kafka-study,然后删掉它的 src 目录,接着在 pom.xml 里面引入下面的依赖。这个项目的作…...
使用腾讯云轻量服务器Matomo应用模板建网站流量统计系统
腾讯云百科分享使用腾讯云轻量应用服务器Matomo应用模板搭建网站流量统计系统,Matomo 是一款开源的网站数据统计软件,可以用于跟踪、分析您的网站的流量,同时充分保障数据安全性、隐私性。该镜像基于 CentOS 7.6 64位操作系统,已预…...
clickhouse-监控配置
一、概述 监控是运维的一大利器,要想运维好clickhouse,首先就要对其进行监控,clickhouse有几种监控数据的方式,一种是系统本身监控,一种是通过exporter来监控,下面分别描述一下 二、系统自带监控 我下面会对监控做一…...
C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解
C11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解 1、互斥量(mutex)的基本概念2、互斥量的用法2.1 lock(),unlock()2.2 lock_guard类模板 3、死锁3.1 死锁演示3.2 死锁的一般解决方案:3.3 std:…...
华为云classroom赋能--Devstar使应用开发无需从零开始
华为云DevStar为开发者提供业界主流框架代码初始化能力,通过GUI、API、CLI等多种方式,将按模板生成框架代码的能力推送至用户桌面。同时基于华为云服务资源、成熟的DevOps开发工具链和面向多场景的众多开发模板,提供一站式创建代码仓、自动生…...
软件的数据回滚
原理:所谓的数据回滚,就是数据备份 增量备份: 全量备份: 最简单的事全量备份。 就是spoon工具,完成把所有的表每天定时复制一份,表名“_日期”。 所以有实时表,每日备份表。 回滚就是把之前…...
git clone使用https协议报错OpenSSL SSL_read: Connection was reset, errno 10054
在使用git 下载github上的代码时, 一般有ssh协议和https协议两种。使用ssh协议可以成功clone代码, 但使用https协议时出错: $ git clone https://github.com/openai/improved-diffusion.git Cloning into improved-diffusion... fatal: unab…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
