SPFA例题/模板
https://www.acwing.com/problem/content/1131/

#include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x++) #define rofe(x,y,z) for(LL x=(y);x>=(z);x--) #define rofn(x,y,z) for(LL x=(y);x>(z);x--) #define pb push_back #define all(x) (x).begin(),(x).end() #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; typedef pair<LL,LL> PLL; int n,m,s,t; vector<int> adj[3000]; vector<int> cost[3000]; int dis[3000]; bool st[3000]; void SPFA() { memset(dis,0x3f,sizeof(dis)); dis[s]=0; deque<int> que; que.push_back(s); st[s]=true; while(que.size()) { int u=que.front(); que.pop_front(); st[u]=false; auto &nxts=adj[u]; auto &costs=cost[u]; int sz=nxts.size(); for(int i=0;i<sz;i++) { if(dis[nxts[i]]>dis[u]+costs[i]) { dis[nxts[i]]=dis[u]+costs[i]; if(!st[nxts[i]]) { que.push_back(nxts[i]); st[nxts[i]]=true; } } } } } void YD() { cin>>n>>m>>s>>t; while(m--) { int a,b,c;cin>>a>>b>>c; adj[a].push_back(b); cost[a].push_back(c); adj[b].push_back(a); cost[b].push_back(c); } SPFA(); cout<<dis[t]<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T=1; //cin >> T; while (T--) { YD(); } return 0; }
需要使用队列,以及st标记数组记录点是否在队列中
每一步出队需要更新距离
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人