算法刷题day36

目录

  • 引言
  • 一、道路与航线
  • 二、最优贸易
  • 三、选择最佳路线

引言

今天先是把之前还不熟的模板都写了一遍,写了才能体会到,其实模板写了背了其实还是不顶用,还是要有大量的刷题积累,才能把模板发挥出来,不然真的你都看不出来模型,你怎么去做。所以得大量的刷题啊,加油吧!


一、道路与航线

标签:图论、SPFA、Dijkstra、最短路

思路:这道题一看边权有负数,所以第一时间就想着用 S P F A SPFA SPFA 算法了,几乎就是模板,然后过了 14 16 \frac{14}{16} 1614 的数据,如果要是放在蓝桥杯里其实已经很不错了,但要是为 A C M ACM ACM 赛制的话,就等于没做,所以我们就要对其优化。这里采用的是 S P F A + S L E SPFA + SLE SPFA+SLE 优化,核心就是判断 d i s t [ j ] dist[j] dist[j] 和队头:如果 d i s t [ j ] < d i s t [ q . f r o n t ( ) ] dist[j]<dist[q.front()] dist[j]<dist[q.front()] ,那就入队头,否则入队尾。加这么点变化,常数就会变小,就刚好能过了。

题目描述:

农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到 T 个城镇,编号为 1∼T。这些城镇之间通过 R 条道路 (编号为 1 到 R) 和 P 条航线 (编号为 1 到 P) 连接。每条道路 i 或者航线 i 连接城镇 Ai 到 Bi,花费为 Ci。对于道路,0≤Ci≤10,000;然而航线的花费很神奇,花费 Ci 可能是负数(−10,000≤Ci≤10,000)。道路是双向的,可以从 Ai 到 Bi,也可以从 Bi 到 Ai,花费都是 Ci。然而航线与之不同,只可以从 Ai 到 Bi。事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策:保证如果有一条航线可以从 Ai 到 Bi,那么保证不可能通
过一些道路和航线从 Bi 回到 Ai。由于约翰的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。他想找到从发送中心城镇 S 把奶牛送到每个城镇的最便宜的方案。输入格式
第一行包含四个整数 T,R,P,S。接下来 R 行,每行包含三个整数(表示一个道路)Ai,Bi,Ci。接下来 P 行,每行包含三个整数(表示一条航线)Ai,Bi,Ci。输出格式
第 1..T 行:第 i 行输出从 S 到达城镇 i 的最小花费,如果不存在,则输出 NO PATH。数据范围
1≤T≤25000,1≤R,P≤50000,1≤Ai,Bi,S≤T
输入样例:
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
输出样例:
NO PATH
NO PATH
5
0
-95
-100

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 3e4+10, M = 5e4*3+10, INF = 0x3f3f3f3f;int n, R, P, S;
int h[N], e[M], w[M], ne[M], idx;
int dist[N];
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void spfa()
{memset(dist, 0x3f, sizeof dist);dist[S] = 0; st[S] = true;deque<int> q; q.push_front(S);while(q.size()){int t = q.front(); q.pop_front();st[t] = false;for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]) {if(q.size() && dist[j] < dist[q.front()]) q.push_front(j);else q.push_back(j);st[j] = true;}}}}
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);memset(h, -1 , sizeof h);cin >> n >> R >> P >> S;while(R--){int a,b,c; cin >> a >> b >> c;add(a,b,c), add(b,a,c);}while(P--){int a, b, c; cin >> a >> b >> c;add(a,b,c);}spfa();for(int i = 1; i <= n; ++i){if(dist[i] == INF) cout << "NO PATH" << endl;else cout << dist[i] << endl;}return 0;
}

二、最优贸易

标签:图论SPFA

思路:这道题刚开始我觉得就是找最大值和最小值一减就行了,虽然过了几个样例但明显不对,因为这是有路程顺序的,并且不是所有的路都是双向的,所以得模拟。我们可以用两个数组来记录当前结点及之前的点的最大值和最小值,然后分别一正一反搜两次,用 S P F A SPFA SPFA 算法,因为有可能第一次走到的点不是最优的,因为有可能退回来,所以得用 S P F A SPFA SPFA,剩余细节见代码。

题目描述:

C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条。C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。商人阿龙来到 C 国旅游。当他得知“同一种商品在不同城市的价格可能会不同”这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚一点
旅费。设 C 国 n 个城市的标号从 1∼n,阿龙决定从 1 号城市出发,并最终在 n 号城市结束自己的旅行。在旅游的过程中,任何城市可以被重复经过多次,但不要求经过所有 n 个城市。阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出
这个水晶球,用赚取的差价当做旅费。因为阿龙主要是来 C 国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。现在给出 n 个城市的水晶球价格,m 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚取多少旅费。注意:本题数据有加强。输入格式
第一行包含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示城市的数目和道路的数目。第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的商品价格。接下来 m 行,每行有 3 个正整数,x,y,z,每两个整数之间用一个空格隔开。如果 z=1,表示这条道路是城市 x 到城市 y 之间的单向道路;如果 z=2,表示这条道路为城市 x 和城市 y 之间的双向道路。输出格式
一个整数,表示答案。数据范围
1≤n≤100000,1≤m≤500000,1≤各城市水晶球价格≤100
输入样例:
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
输出样例:
5

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1e5+10, M = 5e5*3+10, INF = 0x3f3f3f3f;int n, m;
int h[N], rh[N], e[M], w[M], ne[M], idx;
int dmin[N], dmax[N];
bool st[N];void add(int h[], int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void spfa(int h[], int dist[], int S, bool type)  //true为min 
{memset(st, 0, sizeof st);if(type) memset(dist, 0x3f, sizeof dmax);else memset(dist, 0xcf, sizeof dmin);queue<int> q;dist[S] = w[S], q.push(S), st[S] = true;while(q.size()){int t = q.front(); q.pop();st[t] = false;for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if((type && dist[j] > min(dist[t], w[j])) || (!type && dist[j] < max(dist[t], w[j]))){if(type){dist[j] = min(dist[t], w[j]);}else{dist[j] = max(dist[t], w[j]);}if(!st[j]) {q.push(j);}}}}
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);memset(h, -1, sizeof h);memset(rh, -1, sizeof rh);cin >> n >> m;for(int i = 1; i <= n; ++i) cin >> w[i];while(m--){int u,v,t; cin >> u >> v >> t;add(h,u,v), add(rh,v,u);if(t == 2) add(h,v,u), add(rh,u,v);}spfa(h, dmin, 1, true);spfa(rh, dmax, n, false);int res = 0;for(int i = 1; i <= n; ++i) {// cout << dmax[i] << " " << dmin[i] << endl;res = max(res, dmax[i] - dmin[i]);}cout << res << endl;return 0;
}

三、选择最佳路线

标签:最短路

思路:相当于给了一个图,然后求任意多个点到一个点的最短路,这里直接把边建成反向的,然后从终点做一遍最短路,然后在这多个起点中找最小值就行了。这里我把 S P F A SPFA SPFA D i j k s t r a Dijkstra Dijkstra 算法都写了,见代码自行查看。

题目描述:

有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。已知城市中共包含 n 个车站(编号1~n)以及 m 条公交线路。每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。琪琪的朋友住在 s 号车站附近。琪琪可以在任何车站选择换乘其它公共汽车。请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。输入格式
输入包含多组测试数据。每组测试数据第一行包含三个整数 n,m,s,分别表示车站数量,公交线路数量以及朋友家附近车站的编号。接下来 m 行,每行包含三个整数 p,q,t,表示存在一条线路从车站 p 到达车站 q,用时为 t。接下来一行,包含一个整数 w,表示琪琪家附近共有 w 个车站,她可以在这 w 个车站中选择一个车站作为始发站。再一行,包含 w 个整数,表示琪琪家附近的 w 个车站的编号。输出格式
每个测试数据输出一个整数作为结果,表示所需花费的最少时间。如果无法达到朋友家的车站,则输出 -1。每个结果占一行。数据范围
n≤1000,m≤20000,1≤s≤n,0<w<n,0<t≤1000
输入样例:
5 8 5
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1
输出样例:
1
-1

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1010, M = 2e5+10, INF = 0x3f3f3f3f;int n, m, S, k;
int h[N], e[M], w[M], ne[M], idx;
int dist[N];
bool st[N];
int E[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}// void spfa()
// {
// 	memset(st, 0, sizeof st);
// 	memset(dist, 0x3f, sizeof dist);
// 	dist[S] = 0; st[S] = true;// 	queue<int> q; q.push(S);
// 	while(q.size())
// 	{
// 		int t = q.front(); q.pop();
// 		st[t] = false;// 		for(int i = h[t]; i != -1; i = ne[i])
// 		{
// 			int j = e[i];
// 			if(dist[j] > dist[t] + w[i])
// 			{
// 				dist[j] = dist[t] + w[i];
// 				if(!st[j]) st[j] = true, q.push(j);
// 			}
// 		}
// 	}
// }void dijkstra()
{memset(st, 0, sizeof st);memset(dist, 0x3f, sizeof dist);dist[S] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0,S});while(heap.size()){auto t = heap.top(); heap.pop();int v = t.x, p = t.y;if(st[p]) continue;st[p] = true;for(int i = h[p]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > dist[p] + w[i]){dist[j] = dist[p] + w[i];heap.push({dist[j],j});}}}
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);while(cin >> n >> m >> S){memset(h, -1, sizeof h);while(m--){int a, b, c; cin >> a >> b >> c;add(b,a,c);}cin >> k;for(int i = 0; i < k; ++i){cin >> E[i];}dijkstra();
// 		spfa();int res = INF;for(int i = 0; i < k; ++i){int j = E[i];
// 			cout << dist[j] << " ";res = min(res, dist[j]);}if(res == INF) cout << -1 << endl;else cout << res << endl;}return 0;
}

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

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

相关文章

字符串常量池

特点 1 只要是双引号引起来的字符串都存储在常量池中 2 每次存储字符串的时候&#xff0c;先检查常量池是否有该字符串&#xff0c;如果没有则存储&#xff0c;有则直接使用常量池中的字符串。 示例一&#xff1a; 字符串String由两部分组成&#xff0c;value(存储常量池中的…

Unity-C#进阶——3.27更新中

文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈&#xff0c;泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法&#xff1a;线程之间共享数据&#xff1…

Java智慧工地源码 智慧工地的价值体现 开发一套智慧工地系统需要多少钱

智慧工地是智慧地球理念在工程领域的行业具现&#xff0c;是一种崭新的工程全生命周期管理理念。它运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生…

一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

前面写了个博客《conda&#xff1a;解决多项目开发环境配置的神器&#xff01;》简单介绍了 Conda 的安装和基本命令&#xff0c;在做开发时经常会使用 Conda 建立多个应用环境&#xff0c;Conda 的命令虽不复杂&#xff0c;但还是有时会弄混&#xff0c;所以就考虑写个脚本&am…

day5-QT

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QFontDialog> //字体对话框类 #include<QFont> //字体类 #include<QMessageBox> //消息对话框类 #include<QColorDialog> //颜色对话框类 #include<QColor> //颜…

2024年腾讯云4核8G12M轻量服务器并发数测试,支持多少人?

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(五)

ES5和ES6 我们所说的 ES5 和 ES6 &#xff08;2015&#xff09;其实就是在 js 语法的发展过程中的一个版本而已比如我们使用的微信 最早的版本是没有支付功能的随着时间的流逝&#xff0c;后来出现了一个版本&#xff0c;这个版本里面有支付功能了ECMAScript 就是 js 的语法 以…

系统架构设计师考试论文2019:论软件设计方法及其应用

软件设计(SoftwareDesign&#xff0c;SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等&#xff0c;形成软件的具体设计方案。 软件设计把许多事物和问题按不同的层次和角度进行抽象&#xff0c;将问题或事物进行模块化分…

Charles+posten 抓APP包

Charles 是一个比较好用的抓包工具&#xff0c;在实际的工作中&#xff0c;发现一旦模拟器配置了 charles 所在的机器代理&#xff0c;有些app就无法访问网络&#xff0c;这个问题困扰了好几天&#xff0c;最后在书中找到 charles 配合 postern 抓包。 Charles 地址&#xff1…

Springboot+vue的旅游信息推荐系统设计与实现+数据库+论文+数据库表结构文档+免费远程调试

项目介绍: Springbootvue的旅游信息推荐系统设计与实现。Javaee项目&#xff0c;springboot vue前后端分离项目 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot Mybati…

访问者模式(数据与行为解耦)

目录 前言 UML plantuml 类图 实战代码 SimpleFileVisitor FileVisitor 接口 删除指定文件夹 模板 IVisitor IVisitable Client 前言 一个类由成员变量和方法组成&#xff0c;成员变量即是类的数据结构&#xff0c;方法则是类的行为。 如果一个类的数据结构稳定&am…

CF1799 D. Hot Start Up (easyhard version) [dp+不停的优化+线段树]

传送门:CF [前题提要]:D1思维难度不高;D2感觉十分变态,感觉就是为了出题而出题,但是竟然只有*2100,看来还是我太菜了… E a s y v e r s i o n : Easy\;version: Easyversion: 不难想到应该使用 d p dp dp来解决这道题.仔细模拟一下,就会得到一个朴素的定义:考虑定义 d p [ i…

国家开放大学电大《国际私法》形考任务答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 1969年《国际油污损害民事责任公约》实行的是&#xff08; &…

金融投贷通(金融投资+贷款通)项目准备

金融投贷通&#xff08;金融投资贷款通&#xff09;项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例&#xff1a;张三借给李四5W&#xff0c;约定期满1年后…

NPL实例

自然语言处理&#xff08;NLP&#xff09;是人工智能领域的一个重要技术分支&#xff0c;它旨在使计算机能够理解和处理人类语言。以下是一些常见的NLP技术的例子&#xff1a; 1. 机器翻译&#xff1a;NLP技术可以用于将一种语言翻译成另一种语言。例如&#xff0c;Google翻译…

【深度学习】基础知识

吴恩达DeepLearning Python # 1.numpy c c.ravel() 将多维数组拉平 # 2.time tic time.time() toc time.time() print(str(1000*(toc- tic))"ms")

畅捷通T+ Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞

一、漏洞信息 漏洞名称&#xff1a;畅捷通T Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞 漏洞类别&#xff1a;远程命令执行漏洞 风险等级&#xff1a;高危 二、漏洞描述 畅捷通TPlus适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企…

AI论文速读 |(Mamba×时空图预测!) STG-Mamba:通过选择性状态空间模型进行时空图学习

&#xff08;来了来了&#xff0c;虽迟但到&#xff0c;序列建模的新宠儿mamba终于杀入了时空预测&#xff01;&#xff09; 论文标题&#xff1a;STG-Mamba: Spatial-Temporal Graph Learning via Selective State Space Model 作者&#xff1a;Lincan Li, Hanchen Wang&…

C语言经典例题(10) --- 奇偶统计、密码验证、矩阵计算、最低分与最高分之差、序列中删除指定数字

文章目录 1.奇偶统计2.密码验证3.矩阵计算4.最低分与最高分之差5.序列中删除指定数字 1.奇偶统计 题目描述: 任意输入一个正整数N&#xff0c;统计1~N之间奇数的个数和偶数的个数&#xff0c;并输出。 输入描述: 一行&#xff0c;一个正整数N。&#xff08;1≤N≤100,000&am…

​网络安全概论——网络加密与密钥管理​

一、网络加密的方式及实现 1、常见的加密算法 常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。 对称加密算法采用单密钥加密&#xff0c;在通信过程中&#xff0c;数据发送方将原始数据分割成固定大小的块&#xff0c;经过密钥和加密算法逐个加密…