单源最短路总结+练习题

本文详细介绍了单源最短路的建图方法,包括普通无向图和邻接表,以及如何运用Dijkstra算法、DFS和SPFA解决各种实际问题,如找最短路、最长路、集合间最短路等。文中还涉及了新建源点建图和正反建图策略,以及二分答案的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单源最短路总结

建图方式

  • 普通无向图+邻接表建图

板子题

1129. 热浪 - AcWing题库

找最短路里的最长路

1128. 信使 - AcWing题库

经典问题,在无向图中找一点使得其他点到该点距离最小

跑n遍最短路即可

1127. 香甜的黄油 - AcWing题库

考察对dijkstra贪心本质的理解,修改了最短路更新的形式

也可以不想这些,用数学构造出一个新的最短路

1126. 最小花费 - AcWing题库

集合之间的最短路问题,有n个连通块,求到终点最少经过几个连通块。

处理方式很简单,只要让每一条边的边权都为1,跑一遍最短路即可,原理也很简单可以自行推导

920. 最优乘车 - AcWing题库

  • 新建源点建图

有一些题看不出来是最短路,是因为他没有直接问你从起点到终点的最短路。

例如超市购物问题/以物易物问题

903. 昂贵的聘礼 - AcWing题库

这时候就可以通过建立一个新的源点0,然后用0作为起点建图

  • 正反建图+spfa

刷到一道题,需要我们找到1~N这条路径里的两个有序的点,一个在前一个在后。

然后让后减前得到最大值。

由于这两个点是在1~N这条路径上,所以最好用spfa

另外,我们让前面最小,让后面最大怎么办?

首先我们就要界定一个中间点i,

然后求出 1~i 的小权值,和i~n的最大权值即可

前者我们以1为起点跑一遍spfa即可

后者我们不可能以i为点跑spfa,这样复杂度过高。

所以需要以n为起点,这样只要一遍就可以得到答案

但是由于可能会有单向边

所以最好反过来建图

341. 最优贸易 - AcWing题库

单源最短路综合运用

dijkstra+dfs

很板,没什么特点。

1135. 新年好 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define INF 1e10
#define PII pair<int,int>

struct ggg{
   
  int v;
  int w;
};

ll ans=0;

vector<int> dijkstra(vector<ggg>*gg,int n,int start){
   
    
    vector<int> dist(n+1,INF);
    vector<bool> flag(n+1);
    priority_queue<PII,vector<PII>,greater<PII>> q;
    dist[start]=0;
    q.push({
   dist[start],start});
    while(q.size()){
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

louisdlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值