spfa算法
给定一个 nn 个点 mm 条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出 11 号点到 nn 号点的最短距离,如果无法从 11 号点走到 nn 号点,则输出 impossible
。
数据保证不存在负权回路。
输入格式
第一行包含整数 nn 和 mm。
接下来 mm 行每行包含三个整数 x,y,zx,y,z,表示存在一条从点 xx 到点 yy 的有向边,边长为 zz。
输出格式
输出一个整数,表示 11 号点到 nn 号点的最短距离。
如果路径不存在,则输出 impossible
。
数据范围
1≤n,m≤1051≤n,m≤105,
图中涉及边长绝对值均不超过 1000010000。
输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
其实我是喜欢这个算法来着
总的思路就是找到所有应该更新的那个点,加入队列,然后类似于bfs
#include<iostream> #include<queue> #include<cstring> using namespace std; int n,m; const int N=1e5+10; int h[N],e[N],ne[N],w[N],idx; int dist[N]; bool st[N]; void add(int a,int b,int c) { e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=idx++; } int spfa() { memset(dist,0x3f,sizeof(dist)); dist[1]=0; queue<int> q; q.push(1); while(q.size()) { auto t=q.front(); q.pop(); st[t]=false;//防止队列里有重复元素 for(int i=h[t];i!=-1;i=ne[i])//枚举t的所有出边 { int j=e[i]; if(dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i];//直接更新 if(!st[j]) { q.push(j); st[j]=true; } } } } if(dist[n]==0x3f3f3f3f) return -1; else return dist[n]; } int main(){ cin>>n>>m; memset(h,-1,sizeof(h)); for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } int t=spfa(); if(t==-1) cout<<"impossible"<<endl; else cout<<t<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具