最短路径

SPFA (Bellman-Ford 的队列优化版本):

1、求单源最短路径,即每个点到源点的最短距离

2、可以处理负权边的情况

3、可以判断是否出现负权回路

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct node{int x,y,t;
};
int n,m,dis[10001],count[10001];
vector<node> g[10001];
bool flag,inque[10001];
queue<int> q;
bool spfa(int S){memset(dis,0x7f,sizeof(dis));memset(inque,false,sizeof(inque));dis[S]=0;count[S]++;inque[S]=true;q.push(S);while(!q.empty()){int u=q.front();q.pop();inque[u]=false;for(int i=0;i<g[u].size();i++){int v=g[u][i].y;int w=g[u][i].t;if(dis[u]+w<dis[v]){dis[v]=dis[u]+w;if(inque[v]==false){q.push(v);count[v]++;inque[v]=true;if(count[v]==n){return false;}}}}}return true;
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){int x,y,v;cin>>x>>y>>v;g[x].push_back((node){x,y,v});}flag=spfa(1);if(flag==true){cout<<dis[n];}return 0;
}

时间复杂度:O(kM)~O(NM)

常见技巧:

  • 在给平面直角坐标系构图,判断连通性时,仅需要将相邻的点连接(先按照x坐标或y坐标排序)

  • 求一点到多点的距离,可以反向连边

  • 有时会进行拆点

Floyed:

1、求多源最短路径,即点与点之间的最短距离

2、可以处理负权边的情况

3、不能出现负环

一个应用:最短回路(无向图)(有向图算d[s][s])

#include<iostream>
using namespace std;
int dist[101][101],cost[101][101],n,m,s,t,w,ans;
const int maxn=99999999;
int main(){while(cin>>n>>m){ans=maxn;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dist[i][j]=maxn;cost[i][j]=-1;}}for(int i=1;i<=m;i++){cin>>s>>t>>w;dist[s][t]=dist[t][s]=w;cost[s][t]=cost[t][s]=w;}for(int k=1;k<=n;k++){for(int i=1;i<k;i++){for(int j=i+1;j<k;j++){if(cost[i][k]==-1||cost[k][j]==-1)continue;ans=min(ans,dist[i][j]+cost[i][k]+cost[k][j]);}}//省略这段循环则为floyed基本模版 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);}}}if(ans!=maxn)cout<<ans<<endl;else cout<<"No solution."<<endl; }
}

时间复杂度:O(N^3)

Dijkstra:

1、求单源最短路径

2、不能处理负权

普通版:

void dijkstra() {memset(dis,127/3,sizeof(dis));//初始化 v[1]=1;dis[1]=0;for(int i=1;i<=n;++i){int k=0;for(int j=1;j<=n;++j) if(!v[j]&&(k==0||dis[j]<dis[k])) k=j;v[k]=1;for(int j=1;j<=n;++j) if(!v[j]&&dis[k]+a[k][j]<dis[j])dis[j]=dis[k]+a[k][j];}
}

时间复杂度:O(N^2)

堆优化版:

int dis[N],vis[N];
priority_queue<pr,vector<pr> ,greater<pr> > que;
void dijkstra(int s){memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));dis[s]=0;que.push(make_pair(0,s));while(!que.empty()){pr tmp=que.top();que.pop();int d=tmp.first;int u=tmp.second;//if(d!=dis[u]) continue;(等价于if(vis[u]) continue;)if(vis[u]) continue;vis[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;int w=edge[i].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;que.push(pr(dis[v],v));}}}
}

其它优化:博客

时间复杂度:O((M+N)logM) (其中M为边数,N为点数)


update:2021/1/23

  • 如何用单源最短路径算法求多源最短路径问题?(可以出发/终止的点有多个,与Floyed求解问题不同)

---- 建立一个超级起点、超级终点,将所有可能的起点、终点和超级起点、超级终点连接

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

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

相关文章

牛客网 【每日一题】5月11日题目精讲 Moovie Mooving

题目链接 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 Bessie is out at the movies. Being mischievous as always, she has decided to hide from Farmer John for L (1 …

AspNetCore中使用Ocelot之 IdentityServer4

前言&#xff1a;Ocelot网关是基于AspNetCore开发的可扩展的高性能的企业级Api网关&#xff0c;目前已经基于2.0 升级版本升级&#xff0c;在使用AspNetCore 开发的时候可以使用2.0版本了&#xff0c;开源项目Ocelot 张大队长是主力的参与人员&#xff0c;以前提起张大队前面都…

P3177-[HAOI2015]树上染色【树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3177 题目大意 nnn个点的一棵树&#xff0c;将kkk个点染成黑色&#xff0c;其他是白色&#xff0c;使得黑点之间和白点之间两两距离和最大。 解题思路 也是统计每条边的贡献&#xff0c;设fx,if_{x,i}fx,i​表示节点xxx的子…

Nginx主配置文件详解【笔记】

1 Nginx配置文件目录结构 最近使用Nginx做负载均衡&#xff0c;顺便整理Nginx配置文件笔记如下所述&#xff0c;本文主要梳理主配置文件各属性的作用。使用yum安装好Nginx后&#xff0c;可以在默认路径&#xff08;/etc/nginx&#xff09;看到如下配置文件。 /etc/nginx/ ├─…

【矩阵乘法】Quad Tiling(poj 3420)

Quad Tiling poj 3420 题目大意 在一个4n的棋盘上&#xff0c;用12的多米诺骨牌把他填满&#xff0c;问有多少种方法 输入样例 1 10000 3 10000 5 10000 0 0 输出样例 1 11 95数据范围 1⩽N⩽1091 \leqslant N \leqslant 10^91⩽N⩽109 0<M⩽1050 < M \leqslant 10…

牛客网 【每日一题】5月12日题目精讲 模拟战役

链接&#xff1a; 文章目录题目描述题解&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 齐齐和司机在玩单机游戏《红色警戒IV》&#xff0c;现在他们的游戏地图被划…

微服务介绍及Asp.net Core实战项目系列之微服务介绍

0、目录整体架构目录&#xff1a;ASP.NET Core分布式项目实战-目录一、微服务选型在做微服务架构的技术选型的时候&#xff0c;以“无侵入”和“社区活跃”为主要的考量点&#xff0c;将来升级为原子服务架构、量子服务架构的时候、甚至恢复成单体架构的时候&#xff0c;代价最…

P3349-[ZJOI2016]小星星【树形dp,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P3349 题目大意 nnn个点的一棵树&#xff0c;再给出一张图&#xff0c;树上每个点对应图上每个点后要求树上的边图上都有&#xff0c;求有多少种对应方式。 解题思路 由于题目要求每个点只出现一次就加大了难度&#xff0c;可…

【矩阵乘法】生成树计数(luogu 2109/NOI 2007)

生成树计数 luogu 2109 题目大意 有n个排成一列的点&#xff0c;把距离不超过k的点之间连边&#xff0c;问这个图的生成树个数 输入样例 3 5输出样例 75样例说明 样例对应的图如下&#xff1a; 数据范围 解题思路 因为n十分大&#xff0c;不能直接2^m暴力枚举&#x…

[XSY] PQ树(区间DP)

PQ树 对于非叶子节点&#xff0c;它只能调换它的儿子的顺序&#xff0c;却不能调换整颗子树的顺序合法的PQ树都能表示出1,2,3,…,n 这个排列由以上两点可以得出&#xff1a;PQ树的每棵子树对应的一定都是一段连续的数字区间考虑区间DP&#xff0c;设f(l,r)f(l,r)f(l,r)表示数字…

牛客网 【每日一题】5月14日题目 maze

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小明来到一个由n x m个格子组成的迷宫&#xff0c;有些格子是陷阱&#xff0c;用’#‘表示&#xff0c;小明…

你需要知道的这几种 asp.net core 修改默认端口的方式

一般情况下&#xff0c;aspnetcore发布后的默认端口是5000&#xff0c;这个大家都知道&#xff0c;而且默认骨架代码中没有看到任何让你输入的ip地址和端口号&#xff0c;但作为程序员的我们&#xff0c;不希望被框架所管制&#xff0c;那如何实现默认端口的修改呢&#xff1f;…

CF1139D-Steps to One【期望dp,莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/CF1139D 题目大意 不停的在表格中填下1∼m1\sim m1∼m中随机一个数&#xff0c;直到所有数的gcd1gcd1gcd1为止&#xff0c;求期望数的个数。 解题思路 设fnf_nfn​表示现在gcdgcdgcd为nnn时的期望个数。那么有转移方程fn∑i…

【DP】错排问题(ybtoj DP-1-1)

错排问题 ybtoj DP-1-1 题目大意 求n个数的错排种数 输入样例 2输出样例 1数据范围 1⩽n⩽201\leqslant n \leqslant 201⩽n⩽20 解题思路 设fif_ifi​为i个数的错排种数 考虑第i个数能放在前面i-1个位置的其中一个&#xff08;i-1种选法&#xff0c;要乘i-1&#xff0…

牛客网【每日一题】5月15日题目 储物点的距离

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 一个数轴&#xff0c;每一个储物点会有一些东西&#x…

[XSY] 最长公共子串对(后缀自动机)

最长公共子串对 先放一段考场暴力代码&#xff1a; #include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[2005],b[2005]; int na,nb,f[2005][2005],c[2005][2005],ans; //f[i][j]表示 s[1...i]与 t[1...j]以s[i]、t[j]结尾…

P3911-最小公倍数之和【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3911 题目大意 给出数列AAA求∑i1n∑j1nlcm(Ai,Aj)\sum_{i1}^n\sum_{j1}^nlcm(A_i,A_j)i1∑n​j1∑n​lcm(Ai​,Aj​) 解题思路 设cic_ici​表示AjiA_jiAj​i的个数&#xff0c;然后答案就是&#xff08;下面n5e4n5e4n5e4&…

【DP】奇怪汉诺塔(ybtoj DP-1-2)

奇怪汉诺塔 ybtoj DP-1-2 题目大意 求四根柱子的汉诺塔问题 输出 共12行 每行输出第一根柱子有i个圆盘的最小步数 解题思路 设aia_iai​表示三根柱子&#xff0c;第一根柱子有i个圆盘的步数 很显然是先移i-1个到第二根&#xff0c;再移最大的到第三根&#xff0c;再把i-…

牛客网【每日一题】5月18日 「土」秘法地震

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帕秋莉掌握了一种土属性魔法 这种魔法可以在一片kk大小…

AspNetCore 中使用 InentityServer4(2)

基于上一篇文章 实现对IdnetityServer4 服务的使用1&#xff1a;添加接口解决方案&#xff0c;并且使接口受认证服务的保护&#xff1a;首先在解决方案中添加Api项目如下图所示&#xff1a;在API项目中添加Nuget 引用 如下图所示&#xff1a;Install-Package IdentityServer4.A…