056.最短路算法

news/2026/1/21 16:50:09/文章来源:https://www.cnblogs.com/ssbt/p/19509258

Floyd

  • 得到图中任意两点的最点距离

  • 可处理负边,不能处理负环

  • 时间复杂度 O(N ^ 3) (N为节点数)

  • 能处理的数据规模小,一般用邻接矩阵

模板

luogu P2910

const int N=105;
const int INF=0x3f3f3f3f;int dis[N][N];void built(int n){for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){dis[i][j]=INF;}}
}
void floyd(int n){for(int k=1;k<=n;++k){for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(dis[i][k]!=INF&&dis[k][j]!=INF&&dis[i][j]>dis[i][k]+dis[k][j]){dis[i][j]=dis[i][k]+dis[k][j];}}}}
}

Dijkstra

  • 给定起点,得到从起点到每个点的最短距离

  • 不能处理负边

模板

luogu P4779

普通堆实现

  • 时间复杂度 O(M * logM) (M为边数)
const int N=1e5+5;
const int INF=0x3f3f3f3f;struct st{int cur;int cost;
};
struct e{int v,w;
};
vector<e>gra[N];
bool vis[N];
int dis[N];void built(int n){for(int i=1;i<=n;++i){gra[i].clear();dis[i]=INF;vis[i]=0;}
}
void dijkstra(int s){auto cmp=[](st a,st b){return a.cost>b.cost;};priority_queue<st,vector<st>,decltype(cmp)>pq(cmp);dis[s]=0;pq.push({s,0});while(pq.size()){auto [u,c]=pq.top();pq.pop();if(vis[u]==0){vis[u]=1;for(auto [v,w]:gra[u]){int nc=c+w;if(dis[v]>nc){dis[v]=nc;pq.push({v,nc});}}}}
}

反向索引堆实现

  • 时间复杂度 O(M * logN) (M为边数,N为节点数)
const int N=1e5+5;
const int M=2e5+5;
const int INF=0x3f3f3f3f;
int dis[N];//链式前向星建图
int tot;
int head[N];
int nex[M];
int to[M];
int val[M];//手写堆
int heap[N];
int siz;
int tag[N];
//tag=-1 : 没有进过堆 (vis=0)
//tag=-2 : 已出堆结算 (vis=1)
//tag>=0 : 反向索引,指出在堆里的位置void built(int n){tot=1;siz=0;for(int i=1;i<=n;++i){dis[i]=INF;head[i]=0;tag[i]=-1;}
}
void addEdge(int u,int v,int w){nex[tot]=head[u];to[tot]=v;val[tot]=w;head[u]=tot++;
}
void swap(int i,int j){int t=heap[i];heap[i]=heap[j];heap[j]=t;tag[heap[i]]=i;tag[heap[j]]=j;
}
void up(int i){while(dis[heap[(i-1)/2]]>dis[heap[i]]){swap(i,(i-1)/2);i=(i-1)/2;}
}
void down(int i){int l=i*2+1;while(l<siz){int best=l+1<siz&&dis[heap[l+1]]<dis[heap[l]]?l+1:l;if(dis[heap[i]]<=dis[heap[best]])return;swap(best,i);i=best;l=2*i+1;}
}
int pop(){int u=heap[0];swap(0,--siz);down(0);tag[u]=-2;return u;
}
void push(int v,int c){if(tag[v]==-2)return;if(tag[v]==-1){heap[siz]=v;tag[v]=siz++;dis[v]=c;}else dis[v]=min(dis[v],c);up(tag[v]);
}
void dijkstra(int s){push(s,0);while(siz){int u=pop();for(int ei=head[u];ei;ei=nex[ei]){push(to[ei],dis[u]+val[ei]);}}
}

Astar

  • 给定起点,给定终点,求两点间最短距离

  • Dijkstra + 预估函数 实现启发式搜索

  • Astar需要允许走回头路,相比Dijkstra删除vis[]机制

  • 在堆中根据 从起点到当前点的距离 + 从当前点到终点的预估距离 进行排序

  • 常用于网格图寻路,对实现预估函数友好

  • 常用于抽象状态压缩

  • 启发性算法讨论复杂度意义不大

预估函数

  1. 要求 当前点到终点的预估距离 <= 当前点到终点的实际最短距离

  2. 满足1的情况下,预估距离与实际距离越接近,启发性越好

常用预估方法(二维矩阵为例)

  • 曼哈顿距离
int f1(int i,int j,int x,int y){return abs(x-i)+abs(y-j);
}
  • 欧氏距离
//向下取整
int f2(int i,int j,int x,int y){return sqrt((x-i)*(x-i)+(y-j)*(y-j));
}
  • 对角线距离
int f3(int i,int j,int x,int y){return max(abs(x-i),abs(y-j));
}

例题:高尔夫砍树

leercode 675

class Solution {int n,m;struct tree{int h,x,y;};struct st{int x,y,cost,key;};vector<int>mo{-1,0,1,0,-1};int f(int i,int j,int x,int y){return abs(x-i)+abs(y-j);}int Astar(int sx,int sy,int ex,int ey,vector<vector<int>>& g){auto cmp=[](st a,st b){return a.key>b.key;};priority_queue<st,vector<st>,decltype(cmp)>pq(cmp);vector<vector<int>>dis(n,vector<int>(m,0x3f3f3f3f));dis[sx][sy]=0;pq.push({sx,sy,0,0+f(sx,sy,ex,ey)});while(pq.size()){auto [x,y,c,k]=pq.top();pq.pop();if(x==ex&&y==ey)return c;for(int i=0;i<4;++i){int nx=x+mo[i];int ny=y+mo[i+1];if(nx<0||ny<0||nx>=n||ny>=m||g[nx][ny]==0)continue;int nc=c+1;if(dis[nx][ny]>nc){dis[nx][ny]=nc;int nk=nc+f(nx,ny,ex,ey);pq.push({nx,ny,nc,nk});}}}return -1;}
public:int cutOffTree(vector<vector<int>>& g) {n=g.size();m=g[0].size();vector<tree>trees;for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(g[i][j]>1){trees.push_back({g[i][j],i,j});}}}sort(trees.begin(),trees.end(),[](tree a,tree b){return a.h<b.h;});int ans=0;int i=0,j=0;for(auto [_,x,y]:trees){int t=Astar(i,j,x,y,g);if(t==-1)return -1;ans+=t;i=x;j=y;}return ans;}
};

Bellman-Frod 与 SPFA

  • 给定起点,得到从起点到每个点的最短距离

  • 可以处理负边,可以检查负环

模板

luogu P3371

Bellman-Frod

  • 时间复杂度 O(M * N) (M为边数,N为节点数)
const int N=10005;
const int INF=0x3f3f3f3f;struct e{int v,w;
};
vector<e>gra[N];
int dis[N];void built(int n){for(int i=1;i<=n;++i){gra[i].clear();dis[i]=INF;}
}
void bellman_frod(int s,int n){dis[s]=0;for(int i=1;i<n;++i){for(int u=1;u<=n;++u){if(dis[u]==INF)continue;for(auto [v,w]:gra[u]){if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;}}}}
}

SPFA

  • 时间复杂度还是 O(M * N) 只有常数优化,但效果明显

  • 用于费用流

const int N=10005;
const int INF=0x3f3f3f3f;struct e{int v,w;
};
vector<e>gra[N];
int dis[N];
bool in[N];void built(int n){for(int i=1;i<=n;++i){gra[i].clear();in[i]=0;dis[i]=INF;}
}
void spfa(int s){queue<int>q;dis[s]=0;q.push(s);in[s]=1;while(q.size()){int u=q.front();q.pop();in[u]=0;for(auto [v,w]:gra[u]){if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;if(in[v]==0){q.push(v);in[v]=1;}}}}
}

检查负环

luogu P3385

一共有 n 个节点,若无负环,每个节点最多松弛 n-1

添加一个 cnt[] 用来记数,记录每个节点松弛了多少次

若发现某个节点松弛次数大于 n-1 ,说明有负环

若规定从唯一起点开始,直接跑spfa即可

若要检查整张图有无负环,添加一个虚拟起点s

这个起点s连接所有的其它节点,边权为0

//记录每个节点的松弛次数
int cnt[N];
//有负环返回 1 ,否则返回 0 
bool spfa(int s,int n){queue<int>q;q.push(s);in[s]=1;cnt[s]=1;dis[s]=0;while(q.size()){int u=q.front();q.pop();in[u]=0;for(auto [w,v]:gra[u]){if(dis[v]>dis[u]+w){if(cnt[v]++==n)return 1;dis[v]=dis[u]+w;if(!in[v]){q.push(v);in[v]=1;}}}}return 0;
}

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

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

相关文章

2026年主流IM工具推荐:效率革命下的协作新选择(附最新排名及深度解析)

在数字化办公全面普及的今天&#xff0c;即时通讯工具&#xff08;IM&#xff09;早已突破“聊天软件”的范畴&#xff0c;成为企业组织力升级的核心引擎。本文基于2025年行业调研数据与用户真实反馈&#xff0c;精选10款兼具功能性与创新性的IM工具&#xff0c;助你找到最适合…

2026年正规的广播电台广告公司哪家好,广播电台广告/上海花旗大厦广告/上海震旦大厦广告,广播电台广告公司承包商折扣

随着广播电台广告市场的持续扩容,品牌方对广告代理公司的资源整合能力、数据精准度及跨媒体协同效率提出了更高要求。尤其在长三角地区,广播电台广告凭借其场景渗透力与人群触达优势,成为快消、金融、汽车等行业的重…

对标世赛标准!2026年机电一体化实训装置优选品牌TOP5

【行业洞察】 在“中国制造2025”与“新质生产力”战略驱动下,智能制造人才缺口持续扩大,职业院校对光机电一体化实训装置的需求从“有设备”转向“能实战、可升级、贴产业”。据教育部2025年数据,全国超90% 的高职…

1000元百联OK卡回收价格新鲜出炉,三大优势平台推荐

闲置的卡券往往会在抽屉角落被遗忘,直到有效期临近才想起处理,百联OK卡也不例外。对于持有1000面值百联OK卡且暂无使用需求的人来说,回收是盘活闲置的合理选择。了解最新的回收价格、靠谱的回收渠道以及选择技巧,能…

2025年度精选:本地检定器厂家前十强,采购指南在此,微型十字板仪/楼板测厚仪/一体式钢筋扫描仪/钢筋位置测定仪/裂缝测宽仪检定器厂家哪个好

在建筑工程质量检测领域,回弹仪作为无损检测的关键设备,其测量结果的准确性直接关系到结构安全评估的可靠性。而确保回弹仪自身精度符合标准的基石,正是高强回弹仪检定器。随着国内基建质量要求的不断提升和检测标准…

Dify工作流触发飞书审批失败?这份含Wireshark抓包分析、HTTP状态码归因、飞书ISV白名单配置的终极排障手册请收好

第一章&#xff1a;Dify接入飞书审批流自动化的核心机制 Dify 作为一款低代码 AI 应用开发平台&#xff0c;支持通过开放 API 和 Webhook 机制与第三方系统深度集成。将 Dify 接入飞书审批流&#xff0c;能够实现业务决策自动化、信息同步实时化以及跨平台流程闭环管理。其核心…

语音识别结果导出:SenseVoiceSmall JSON格式生成实战

语音识别结果导出&#xff1a;SenseVoiceSmall JSON格式生成实战 1. 引言&#xff1a;为什么需要结构化语音识别输出&#xff1f; 你有没有遇到过这种情况&#xff1a;用语音识别工具转写了一段会议录音&#xff0c;结果只得到一长串文字&#xff0c;根本分不清谁在什么时候说…

目前银座购物卡回收三家合规正规平台推荐

几张许久未用的银座购物卡在生活并不少见,它们或是节日收到的馈赠,或是购物后剩余的结余,闲置一旁既占空间,还可能因遗忘过期造成损失。不少人都有过类似的困扰,想将这些闲置银座卡进行回收,却又不知该如何筛选可…

2026新加坡 EOR 服务商怎么选, Safeguard Global 名义雇主优势全梳理

在企业加速全球化布局的背景下,越来越多的中国企业将目光投向东南亚、欧洲及亚太等区域,其中新加坡作为连接东西方的重要枢纽,成为出海首选地之一。然而,企业在新加坡设立实体前若需快速雇佣本地员工,往往面临复杂…

目前京东e卡回收正规级线上平台推荐

闲置京东e卡的合理处置,正在成为越来越多人关注的日常。当手中的京东e卡无法及时使用,既担心过期浪费,又不知如何妥善处理时,正规的线上回收渠道便成了实用的解决方案。选择合适的渠道,不仅能让闲置的卡片重新产生…

如何在MCP Server中启用CORS并保障API安全?,架构师亲授核心技巧

第一章&#xff1a;MCP Server中CORS机制的核心原理 在现代Web应用架构中&#xff0c;MCP&#xff08;Microservice Communication Platform&#xff09;Server作为核心通信枢纽&#xff0c;常需处理来自不同源的前端请求。由于浏览器实施同源策略&#xff08;Same-Origin Poli…

stdio mcp

先写一个工具点击查看代码 import subprocess import shlex from mcp.server.fastmcp import FastMCP from typing import Annotated from pydantic import Field, BaseModelmcp = FastMCP()@mcp.tool(name="run_…

Paraformer-large语音识别流水线:从上传到输出完整链路

Paraformer-large语音识别流水线&#xff1a;从上传到输出完整链路 1. 快速上手&#xff1a;一键部署你的离线语音转写系统 你是否遇到过这样的场景&#xff1f;手里有一段长达数小时的会议录音&#xff0c;需要快速整理成文字稿&#xff0c;但手动听写耗时又容易出错。现在&…

Glyph自动驾驶应用:道路标识识别系统部署案例

Glyph自动驾驶应用&#xff1a;道路标识识别系统部署案例 1. 让AI“看懂”交通标志&#xff1a;Glyph在自动驾驶中的实际应用 你有没有想过&#xff0c;自动驾驶汽车是怎么认出路边的限速牌、停车标志或者转弯指示的&#xff1f;这背后其实是一套复杂的视觉识别系统在工作。今…

多任务并行无干扰,MonkeyCode 独立环境解锁高效研发

多任务并行无干扰,MonkeyCode 独立环境解锁高效研发当下AI编程工具品类繁多,但绝大多数仅能覆盖“代码撰写、Demo运行”的基础诉求,难以匹配真实工程研发的复杂场景。长亭科技全新推出的AI开发平台MonkeyCode,成功…

2026年1月力量型健身器材行业竞争格局深度分析报告

一、核心结论 1.1 核心评估框架 本次评估基于力量型健身器材行业核心竞争力维度,选取四大关键指标构建综合评估体系:一是技术硬核度(核心部件工艺、智能系统迭代能力及安全合规水平);二是场景适配力(产品定制化改…

_LazyAutoMapping

Transformers 源码笔记:_LazyAutoMapping 与 AutoModel 配置匹配逻辑 在 Transformers 库中,AutoModel 系列类(如 AutoModelForCausalLM)的核心能力是根据配置类自动匹配并加载对应的模型类,而实现这一能力的关键…

多喝水真的伤肾吗?这篇文让你告别饮水焦虑,轻松养肾!

你是不是也听过这样的话&#xff1a;“水喝多了会伤肾”&#xff1f; 这句话&#xff0c;就像一颗小小的种子&#xff0c;在很多人心里生根发芽&#xff0c;让他们对喝水这件事充满了顾虑&#xff0c;甚至因此不敢多喝水。然而&#xff0c;对于大多数健康的成年人来说&#xf…

1月21日-2026海外人力资源与EOR服务商推荐,解锁全球雇佣新方案

中资企业出海浪潮持续升温,海外市场的机遇与挑战并存。企业如何在未设立实体的新市场快速、合规地招募到合适人才,成为全球化战略的关键环节。 一、 服务商定义 名义雇主(EOR)是一种专业服务模式,指在多个国家和地…

国内评价高的钣金加工产品推荐排行榜单,钣金加工口碑推荐榜精选优质厂家

随着工业4.0浪潮的推进,钣金加工行业正经历从传统制造向智能化、柔性化生产的转型。自动化设备的应用显著提升了加工精度与效率,但市场仍面临设备同质化、技术参差不齐、交付周期不稳定等痛点。如何筛选出兼具技术实…