
spfa()算法
发布日期:2021-05-14 16:43:50
浏览次数:17
分类:精选文章
本文共 1385 字,大约阅读时间需要 4 分钟。
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。
数据保证不存在负权回路。
输入格式
第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出”impossible”。
数据范围
1≤n,m≤105, 图中涉及边长绝对值均不超过10000。输入样例:
3 3 1 2 5 2 3 -3 1 3 4 输出样例: 2 AC代码:#include#include #include #include using namespace std;const int N=200010;int h[N],e[N],ne[N],idx;int w[N];bool st[N];int d[N];void add(int a,int b,int c){ e[idx]=b; w[idx]=c; ne[idx]=h[a]; h[a]=idx++; }int m,n,k;int spfa(){ queue q; memset(d,0x3f,sizeof(d)); d[1]=0; st[1]=1; q.push(1); while(q.size()) { int t=q.front(); q.pop(); st[t]=0; for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(d[j]>d[t]+w[i]) { d[j]=d[t]+w[i]; if(!st[j]) { st[j]=1; q.push(j); } } } } if(d[n]>0x3f3f3f3f/2) return 0; else return d[n];}int main(){ memset(h,-1,sizeof(h)); cin>>n>>m; while(m--) { int a,b,c; cin>>a>>b>>c; add(a,b,c); } if(spfa()){ printf("%d\n",spfa()); } else { printf("impossible\n"); } return 0;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月26日 21时45分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
有道云笔记 同步到我的博客园
2021-05-09
李笑来必读书籍整理
2021-05-09
Hadoop(十六)之使用Combiner优化MapReduce
2021-05-09
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2021-05-09
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2021-05-09
IOS开发Swift笔记16-错误处理
2021-05-10
flume使用中的一些常见错误解决办法 (地址已经使用)
2021-05-10
andriod 开发错误记录
2021-05-10
C语言编译错误列表
2021-05-10
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2021-05-10
张一鸣:创业7年,我经历的5件事
2021-05-10
《web安全入门》(四)前端开发基础Javascript
2021-05-10
python中列表 元组 字典 集合的区别
2021-05-10
python struct 官方文档
2021-05-10
Android DEX加固方案与原理
2021-05-10
Android Retrofit2.0 上传单张图片和多张图片
2021-05-10
iOS_Runtime3_动态添加方法
2021-05-10
Leetcode第557题---翻转字符串中的单词
2021-05-10