当前位置: 首页 > news >正文

单源、多源最短路

一、单源最短路(无负权)

1.BFS(无边权)

2.dijkstra(暴力)

#include<bits/stdc++.h> #define ll long long using namespace std; ll dis[101290],n,m,s; bool vis[101001]; vector<pair<int,int>> g[10005]; void d(){ memset(dis,0x3f,sizeof(dis)); dis[s]=0; for(int i=1;i<=n;i++){ ll minx = 0x3f3f3f3f,u; for(int j=1;j<=n;j++){ if(dis[j]<minx&&vis[j]==false) minx=dis[j],u=j; } vis[u]=true; for(int j=0;j<g[u].size();j++){ int y=g[u][j].first,z=g[u][j].second; if(dis[y]>dis[u]+z) dis[y]=dis[u]+z; } } } int main(){ cin>>n>>m>>s; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; g[x].push_back({y,z}); } d(); for(int i=1;i<=n;i++){ if(vis[i]==0) cout<<(1<<31)-1<<' '; else cout<<dis[i]<<' '; } return 0; }

2.dijkstra(m log n) 优化查找部分

#include<bits/stdc++.h> using namespace std; int n,m,vis[101009]; vector<int> a[100100]; struct qwerty{ int x,st; }; queue<qwerty> q; long long bfs(){ q.push({1,0}); vis[1]=1; while(!q.empty()){ qwerty n1=q.front(); q.pop(); if(n1.x==n) return n1.st; for(int i=0;i<a[n1.x].size();i++){ qwerty n2={a[n1.x][i],n1.st+1}; if(vis[n2.x]==0){ q.push(n2); vis[n2.x]=1; } } } return 3521; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; a[x].push_back(y); a[y].push_back(x); } cout<<bfs(); return 0; }

二、单源最短路(有负权)

1.bellman-ford(n*m)

负权用dijkstra会崩。

#include <bits/stdc++.h> #include <bits/c++config.h> #include <ostream> #include <istream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <time.h> #include <ctime> #include <cstdlib> #define ll long long #define ull unsigned long long #define db double #define st string #define ch char #define bo bool #define s1 27 #define s2 205 #define s3 2005 #define s4 20005 #define s5 200005 #define s6 2000005 #define s7 20000005 using namespace std; int n,m,s,dis[s5]; vector< pair<int,int> > g[s5]; bool bell(){ memset(dis,0x7f,sizeof(dis)); dis[1]=0; bool f=0; for(int i=1;i<=n;i++){ f=0; for(int j=1;j<=n;j++){ for(int k=0;k<g[j].size();k++){ int v=g[j][k].first; int w=g[j][k].second; if(dis[j]!=0x7f7f7f7f&&dis[j]+w<dis[v]){ dis[v]=dis[j]+w; f=1; } } } } return f; } signed main(){ int T; cin>>T; while(T--){ cin>>n>>m; for(int i=1;i<=n;i++){ g[i].clear(); } for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; if(w<0){ g[u].push_back({v,w}); } else{ g[u].push_back({v,w}); g[v].push_back({u,w}); } } if(bell()){ cout<<"YES\n"; } else{ cout<<"NO\n"; } } return 0; }

2.SPFA(n~nm)

#include <bits/stdc++.h> #include <bits/c++config.h> #include <ostream> #include <istream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <time.h> #include <ctime> #include <cstdlib> #define ll long long #define ull unsigned long long #define db double #define st string #define ch char #define bo bool #define s1 27 #define s2 205 #define s3 2005 #define s4 20005 #define s5 200005 #define s6 2000005 #define s7 20000005 using namespace std; int n,m,s,dis[s5]; vector< pair<int,int> > g[s5]; bool spfa(){ queue<int> q; memset(dis,0x7f,sizeof(dis)); bool iq[s5]={0}; int c[s5]={0}; dis[1]=0; q.push(1); while(!q.empty()){ int u=q.front();q.pop(); iq[u]=0; for(int i=0;i<g[u].size();i++){ int v=g[u][i].first; int w=g[u][i].second; if(dis[u]+w<dis[v]){ dis[v]=w+dis[u]; c[v]=c[u]+1; if(c[v]>=n) return 1; if(!iq[v]){ q.push(v); iq[v]=1; } } } } return 0; } signed main(){ int T; cin>>T; while(T--){ cin>>n>>m; for(int i=1;i<=n;i++){ g[i].clear(); } for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; if(w<0){ g[u].push_back({v,w}); } else{ g[u].push_back({v,w}); g[v].push_back({u,w}); } } if(spfa()){ cout<<"YES\n"; } else{ cout<<"NO\n"; } } return 0; }

二、多源最短路

1.floyd(n^3)(DP)

状态:dp[k][i][j]:i到j最多经过前k个点的最小距离。

状态转移方程:dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j]);

空间优化:少一维k。

#include <bits/stdc++.h> #include <bits/c++config.h> #include <ostream> #include <istream> #include <algorithm> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <time.h> #include <ctime> #include <cstdlib> #define ll long long #define ull unsigned long long #define db double #define st string #define ch char #define bo bool #define s1 27 #define s2 205 #define s3 2005 #define s4 20005 #define s5 200005 #define s6 2000005 #define s7 20000005 using namespace std; int n,m,dp[101][101],g[101][101]; signed main(){ cin>>n>>m; memset(g,0x3f,sizeof(g)); for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; g[y][x]=min(g[y][x],z); g[x][y]=min(g[x][y],z); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dp[i][j]=g[i][j]; if(i==j) dp[i][j]=0; } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<dp[i][j]<<' '; } cout<<'\n'; } return 0; }
http://www.jsqmd.com/news/748859/

相关文章:

  • 第一章:drm子系统概述:1.3 专栏主线——以 BO 生命周期为线索
  • DFRobot Beetle RP2040微型开发板评测与应用指南
  • 2026互感器励磁特性测试仪选型:充气式试验变压器/变压器综合特性测试仪/变压器综合试验测试仪/变频互感器伏安特性测试仪/选择指南 - 优质品牌商家
  • Python热门开源项目推荐,速度学习
  • 数字藏品和 NFT 有什么区别?2026 概念对比、监管差异与行业合规解析
  • Gazebo UI太复杂?5个隐藏快捷键和自定义布局技巧,让你仿真效率翻倍
  • OpenClaw 如何快速接入 Taotoken 实现多模型调用
  • 2026年4月去水印工具优质服务商名录及选购指南:无法下载的视频怎么下/短视频批量下载神器/能去水印的app推荐/选择指南 - 优质品牌商家
  • Python学习--tuple元祖
  • RubyLLM:统一AI接口,提升Ruby开发效率与多模型集成
  • 实战应用操作系统:基于快马生成代码实现一个简易Shell解释器
  • Text2SQL智能查询系统 全局异常处理体系构建与代码精简优化
  • PhyCritic:AI模型的物理合理性多模态评判工具
  • 嵌入式系统平台选择与视频处理优化实战
  • 2026集装箱厕所选购优质品牌推荐:折叠集装箱、活动房、移动活动板房、集装箱宿舍、k式活动板房、双层活动板房、工地打包箱选择指南 - 优质品牌商家
  • 高效开发环境配置:从自动化脚本到团队协作的最佳实践
  • ARM RealView Debugger项目定制与构建配置详解
  • 远程调用本地Mac工具:使用remote2mac搭建安全高效的云端-本地桥梁
  • 技术深度解析:KCN-GenshinServer原神私服GUI服务端的架构设计与实现方案
  • 2026年轻食加盟品牌收费排行:轻食加盟费多少、轻食外卖加盟店、轻食店加盟、轻食沙拉加盟、加盟外卖店、加盟轻食店选择指南 - 优质品牌商家
  • ARM调试状态原理与寄存器访问机制详解
  • 混杂接口配置练习
  • 本地知识库构建利器Scriven:基于语义搜索的私有化文档管理方案
  • FPGA工程师的视角:手把手教你读懂CY7C68013A引脚图,搞定与FPGA的硬件连接
  • ClawFlow:开源低代码自动化平台,融合爬虫与工作流
  • Reckoner:基于声明式YAML实现Helm批量部署与GitOps实践
  • Claude Code 如何配置 Taotoken 聚合端点实现稳定编程助手对接
  • 文本生成LoRA:用AI大模型自动化微调Stable Diffusion
  • 内存视频处理:基于共享内存与零拷贝的高性能视频流水线设计
  • 告别手动搜索!LRCGET:离线音乐库批量歌词下载的终极解决方案