单源最短路总结
建图方式
板子题
找最短路里的最长路
经典问题,在无向图中找一点使得其他点到该点距离最小
跑n遍最短路即可
考察对dijkstra贪心本质的理解,修改了最短路更新的形式
也可以不想这些,用数学构造出一个新的最短路
集合之间的最短路问题,有n个连通块,求到终点最少经过几个连通块。
处理方式很简单,只要让每一条边的边权都为1,跑一遍最短路即可,原理也很简单可以自行推导
有一些题看不出来是最短路,是因为他没有直接问你从起点到终点的最短路。
例如超市购物问题/以物易物问题
这时候就可以通过建立一个新的源点0,然后用0作为起点建图
刷到一道题,需要我们找到1~N这条路径里的两个有序的点,一个在前一个在后。
然后让后减前得到最大值。
由于这两个点是在1~N这条路径上,所以最好用spfa
另外,我们让前面最小,让后面最大怎么办?
首先我们就要界定一个中间点i,
然后求出 1~i 的小权值,和i~n的最大权值即可
前者我们以1为起点跑一遍spfa即可
后者我们不可能以i为点跑spfa,这样复杂度过高。
所以需要以n为起点,这样只要一遍就可以得到答案
但是由于可能会有单向边
所以最好反过来建图
单源最短路综合运用
dijkstra+dfs
很板,没什么特点。
#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()){