1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本
⾝的路径赋为 无穷大)。然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把
该点加⼊到队列最后。重复执⾏直到队列为空。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
const int maxx=1003;
const int inf=0x3f3f3f3f;
vector<int>G[maxx];
queue<int>q;
int e[maxx][maxx];
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n;
string s1,s2;
void SPFA_min(int n,int u){q.push(u);vis[u]=1;dist[u]=0; while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dist[v]>dist[u]+e[u][v]){dist[v]=dist[u]+e[u][v];pre[v]=u;if(vis[v]==0){q.push(v);vis[v]=1;}}}}
}
int main(){while(scanf("%d",&n)){if(n==-1)break;map<string,int>mp;string st1,st2;mp.clear();cin>>st1>>st2;for(int i=0;i<=305;i++){dist[i]=inf;for(int j=0;j<=305;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}int cnt=1;mp[st1]=cnt;for(int i=1;i<=n;i++){int cost;cin>>s1>>s2>>cost;if(mp.find(s1)!=mp.end()&&mp.find(s2)!=mp.end()){e[mp[s1]][mp[s2]]=e[mp[s2]][mp[s1]]=cost;G[mp[s1]].push_back(mp[s2]);G[mp[s2]].push_back(mp[s1]);}else if(mp.find(s1)!=mp.end()&&mp.find(s2)==mp.end()){int y=++cnt;e[mp[s1]][y]=e[y][mp[s1]]=cost;mp[s2]=y;G[mp[s1]].push_back(mp[s2]);G[mp[s2]].push_back(mp[s1]);}else if(mp.find(s1)==mp.end()&&mp.find(s2)!=mp.end()){int y=++cnt;e[y][mp[s2]]=e[mp[s2]][y]=cost;mp[s1]=y;G[mp[s1]].push_back(mp[s2]);G[mp[s2]].push_back(mp[s1]);}else {int y=++cnt;int x=++cnt;e[y][x]=e[x][y]=cost;mp[s1]=y;mp[s2]=x;G[mp[s1]].push_back(mp[s2]);G[mp[s2]].push_back(mp[s1]);}}SPFA_min(n,mp[st1]);if(dist[mp[st2]]==inf){cout<<-1<<endl;}else{cout<<dist[mp[st2]]<<endl;}}return 0;
}

HDU2112(SPFA算法)相关推荐

  1. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

  2. 图论-最短路径--3、SPFA算法O(kE)

    SPFA算法O(kE) 主要思想是:     初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束.     这个算 ...

  3. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  4. poj2387(SPFA算法)

    1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大).然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所 ...

  5. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  6. SPFA算法O(kE)

    SPFA算法O(kE) Dijkstra和Floyed是不断的试点.Dijkstra试最优点,Floyed试所有点. Bellman-Ford和SPFA是不断的试边.Bellman-Ford是盲目的试 ...

  7. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  8. 最短路径:Dijkstra、BellmanFord以及SPFA算法

    最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...

  9. 最短路径(Dijkstra、Bellman-Ford和SPFA算法)

    最短路径(Dijkstra.Bellman-Ford和SPFA算法) 前言 图的存储方式 邻接矩阵 邻接表 链表建立 利用vector 结构体 核心思路 Dijkstra算法 图解 基本思想 求解步骤 ...

  10. HDU SPFA算法 Invitation Cards

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 分析: 题意:求1点到其它点的最短距离之和+其它点到1点的最短距离之和 前面一部分直接用SPFA ...

最新文章

  1. Shell 前后台任务
  2. OPPO Find X3通过网站推广正式官宣,打破常规探索高端旗舰新突破!
  3. 1.12 声明自定义异常
  4. 信息系统项目管理师-计算题专题(三)上午计算小题
  5. codeforce GOODBYE 2018
  6. Python(8):模块内置变量
  7. stk在计算机仿真中的应用_浅析仿真技术在激光系统设计中的应用
  8. python安装mysql数据库_windows10安装mysql-8.0.13(zip安装)~Python安装mysql
  9. 基于 registry 搭建 Docker 私有镜像仓库
  10. Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
  11. Oracle 获取表注释和列注释
  12. mysql_num_fielfs_mysql_num_fields
  13. 盘点功能软件测试用例,盘点那些必不可少的“用例集”
  14. vi编辑器替换字符串命令
  15. JavaWeb开发——JSP技术
  16. 接口测试工具postman
  17. 使用U盘重装MacOS的简单步骤
  18. 字节二面、三面面经及内推
  19. jsr、jcp和harmony的介绍
  20. Shiro的安装和基本使用

热门文章

  1. 订单管理之获取订单表表列表数据
  2. 爬虫爬取https://www.exploit-db.com/老是跳过一个
  3. 目标检测中的Tricks
  4. 15年经验分享:40个改变编程技能的小技巧
  5. springMVC 使用WebApplicationContext获取ApplicationContext对象
  6. 堆、栈、方法区、静态代码块---Java
  7. 在iOS端如何使用Charles用作http调试
  8. hadoop 提高hdfs删文件效率----hadoop删除文件流程解析
  9. 获取手机上的相关参数方法
  10. pyspark常用API