最短路(基础篇)
全源最短路模板
Floyd
我们设
于是简单枚举一下进行转移即可,时间复杂度
代码:
for(k=1;k<=n;k++){
for(x=1;x<=n;x++){
for(y=1;y<=n;y++){
f[x][y]=min(f[x][y],f[x][k]+f[k][y]);
}
}
}
单源最短路模板
单源最短路径
我们考虑一条边
于是
注意:如果一条边被松弛了
因为
int spfa(int S,int T){
int hh=0,tt=1;
memset(d,0x3f,sizeof d);
q[0]=S;st[S]=1;d[S]=0;
while(hh!=tt){
int t=q[hh++];
if(hh==N)hh=0;
st[t]=0;
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(d[j]>d[t]+w[i]){
d[j]=d[t]+w[i];
if(!st[j]){
q[tt++]=j;
if(tt==N)tt=0;
st[j]=1;
}
}
}
}
return d[T]>=d[0]/2?d[0]:d[T];
}
单源最短路径(强化版)
上述算法会被卡掉,所以我们考虑一种新的最短路算法
我们考虑现在有两个集合,一个是已经确定最短路的
初始化
堆优化代码:
void dijkstra(int s){
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push({0,s});
while(!q.empty()){
int u=q.top().u;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(auto ed:e[u]){
int v=ed.v,w=ed.w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push({dis[v],v});
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】