题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

题目大意:找点1到点n的最短路(无向图)

练一下最短路。。。

dijkstra+队列优化:

  1. #include<iostream>
  2. #include<functional>
  3. #include<vector>
  4. #include<queue>
  5. using namespace std;
  6. typedef pair<int, int> p;//first是最短距离,second是顶点编号
  7. const int N = ;
  8. const int INF = << ;
  9.  
  10. struct edge {
  11. int to, cost;//邻接的点,以及到该点的权值
  12. };
  13.  
  14. vector<edge>eg[N];//邻接表
  15. bool used[N];//表示是否已被使用过
  16. int d[N];//最短距离
  17. int V, E;//顶点数和边数
  18.  
  19. void dijistra(int s) {
  20. //优先队列,按first从小到大顺序
  21. priority_queue<p, vector<p>, greater<p> >q;
  22. //初始化
  23. for (int i = ; i <= V; i++) {
  24. d[i] = INF;
  25. used[i] = false;
  26. }
  27. d[s] = ;
  28.  
  29. q.push(p(, s));
  30. while (!q.empty()) {
  31. p p1 = q.top();
  32. q.pop();
  33. int v = p1.second;
  34. if (used[v]) continue;
  35. used[v] = true;
  36. for (int i = ; i<eg[v].size(); i++) {
  37. edge e = eg[v][i];
  38. if (d[e.to]>d[v] + e.cost) {
  39. d[e.to] = d[v] + e.cost;
  40. q.push(p(d[e.to], e.to));
  41. }
  42. }
  43. }
  44. }
  45.  
  46. int main() {
  47. while (cin >> V >> E && (V || E)) {
  48. for(int i=;i<=V;i++){
  49. eg[i].clear();
  50. }
  51. for (int i = ; i <= E; i++) {
  52. int a, b, cost;
  53. cin >> a >> b >> cost;
  54. edge g1, g2;
  55. g1.to = b, g2.to = a;
  56. g1.cost = g2.cost = cost;
  57. eg[a].push_back(g1);
  58. eg[b].push_back(g2);
  59. }
  60. dijistra();
  61. cout << d[V] << endl;
  62. }
  63. }

bellman-ford:

  1. /*
  2. bellman-ford
  3. */
  4. #include<iostream>
  5. #include<cstring>
  6. using namespace std;
  7. const int N=;
  8. const int INF=<<;
  9.  
  10. struct edge{
  11. int from,to,cost;
  12. }es[N];//边
  13.  
  14. int d[N];//出发点到i的最短距离
  15. int V,E;//顶点数、边数
  16.  
  17. //求解从顶点s出发到所有点的最短距离
  18. void shortest_path(int s){
  19. for(int i=;i<=V;i++) d[i]=INF;
  20. d[s]=;
  21. while(true){
  22. bool update=false;
  23. for(int i=;i<=E;i++){
  24. edge e=es[i];
  25. if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost){
  26. d[e.to]=d[e.from]+e.cost;
  27. update=true;
  28. }
  29. //双向
  30. if(d[e.to]!=INF&&d[e.from]>d[e.to]+e.cost){
  31. d[e.from]=d[e.to]+e.cost;
  32. update=true;
  33. }
  34.  
  35. }
  36. if(!update) break;
  37. }
  38. }
  39.  
  40. int main(){
  41. int n,m;
  42. while(cin>>V>>E&&(V||E)){
  43. for(int i=;i<=E;i++){
  44. cin>>es[i].from>>es[i].to>>es[i].cost;
  45. }
  46. shortest_path();
  47. cout<<d[V]<<endl;
  48. }
  49. }

floyd:

  1. /*floyd*/
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=;
  6. const int INF=<<;
  7. int map[N][N];//map[i][j]表示边i~j的距离
  8.  
  9. int V,E;//顶点数,边数
  10.  
  11. void floyd(){
  12. for(int k=;k<=V;k++)
  13. for(int i=;i<=V;i++)
  14. for(int j=;j<=V;j++)
  15. map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
  16. }
  17.  
  18. int main(){
  19. while(cin>>V>>E&&(V||E)){
  20. for(int i=;i<=V;i++){
  21. for(int j=;j<=V;j++){
  22. if(i==j)
  23. map[i][j]=;
  24. else
  25. map[i][j]=INF;
  26. }
  27. }
  28. for(int i=;i<=E;i++){
  29. int a,b,cost;
  30. cin>>a>>b>>cost;
  31. map[a][b]=map[b][a]=cost;
  32. }
  33. floyd();
  34. cout<<map[][V]<<endl;
  35. }
  36. }

spfa:

  1. /*spfa*/
  2. #include<iostream>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=;
  7. const int INF=<<;
  8.  
  9. int map[N][N];
  10. int d[N];//距离起点最小距离
  11. bool used[N];//点是否在队列中
  12. int V,E;//顶点数,边数
  13.  
  14. //求解从顶点s出发到所有点的最短距离
  15. void spfa(int s){
  16. //初始化
  17. for(int i=;i<=V;i++){
  18. d[i]=INF;
  19. used[i]=false;
  20. }
  21. d[s]=;
  22.  
  23. queue<int>q;
  24. q.push(s);
  25. used[s]=true;
  26. while(!q.empty()){
  27. int k=q.front();
  28. q.pop();
  29. used[k]=false;
  30. //此处实际上可以不用遍历所有点,能够用邻接表优化
  31. for(int i=;i<=V;i++){
  32. if(d[i]>d[k]+map[k][i]){
  33. d[i]=d[k]+map[k][i];
  34. //这个点更新后要入队,要判断是否已经在队列中
  35. if(!used[i]){
  36. q.push(i);
  37. used[i]=true;
  38. }
  39. }
  40. }
  41. }
  42. }
  43.  
  44. int main(){
  45. while(cin>>V>>E&&(V||E)){
  46. //初始化
  47. for(int i=;i<=V;i++)
  48. for(int j=;j<=V;j++)
  49. map[i][j]=(i==j?:INF);
  50.  
  51. for(int i=;i<=E;i++){
  52. int a,b,cost;
  53. cin>>a>>b>>cost;
  54. map[a][b]=map[b][a]=cost;
  55. }
  56. spfa();
  57. cout<<d[V]<<endl;
  58. }
  59. }

HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)的更多相关文章

  1. HDU 2544 最短路 (Floyd)

    题意:略. 析:由于 n 比较小,所以我们可以用Floyd,完全不会超时. 代码如下: #pragma comment(linker, "/STACK:1024000000,10240000 ...

  2. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  4. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  5. 蓝桥杯 algo_5 最短路 (bellman,SPFA)

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...

  6. hdu 2544 最短路

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi ...

  7. hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online

    这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...

  8. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  9. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

随机推荐

  1. 洛谷 P1278 单词游戏 【状压dp】

    题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...

  2. bzoj3192: [JLOI2013]删除物品(树状数组)

    既然要从一个堆的堆顶按顺序拿出来放到第二个堆的堆顶,那么我们就可以把两个堆顶怼在一起,这样从一个堆拿到另一个堆只需要移动指针就好了. 换句话说,把1~n倒着,n+1到n+m正着,用一个指针把两个序列分 ...

  3. python基础----实现上下文管理协议__enter__和__exit__

    我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明_ ...

  4. restful风格请求及都是 / 的请求及参数也在请求的/中

    前台请求的样式: http://localhost:8080/item/88909 其中参数就是最后的 商品id号  88909 后台Controller中取出参数的方法: @Controller p ...

  5. HDU 2586 倍增法求lca

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. ios 逆向

    Theos https://www.jianshu.com/p/307243ea40e4 Dumpsdecrypted https://www.cnblogs.com/wangyaoguo/p/908 ...

  7. HAOI2017游记

    HACF的最终成绩已经出炉,但是事情还没有结束. 好多想说的,不知道从何说起,就按照时间顺序说吧. 考前 考前大概一周半就开始复习了,一些比较重要的算法,比如KDT,单纯性,线性基等等没有再继续学,所 ...

  8. linux shell学习五

    参考:https://www.linuxdaxue.com/ Shell函数 因为函数是脚本类语言,在执行时是逐行执行的,因此,Shell 函数必须先定义后使用. Shell 函数的定义格式如下: [ ...

  9. CSS3实现文本垂直排列

    最近的一个项目中要使文字垂直排列,也就是运用了CSS的writing-mode属性. writing-mode最初时ie中支持的一个属性,后来在CSS3中增添了这一新的属性,所以在ie中和其他浏览器中 ...

  10. .Net平台下实例类型无法转换成接口类型?

    首先这种情况出现在应用程序启动前的方法里面. 本想通过发射来实现一些功能.谁知道被这个坑了. 碰到这种问题.已经相当无语了.同时也不知道该如何解决.望有能之士帮忙解答 using System; us ...