输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
 
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
 
Sample Output
3
2
 
Source
 

代码:基于数组(时间复杂度为O(n^2))

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int inf=0x3f3f3f3f ;
  4. int path[];
  5. int sta[][],lowcost[];
  6. void Dijkstra( int cost[][], int n )
  7. {
  8. int i,j,min;
  9. int vis[]={};
  10. for(i=; i<n ; i++)
  11. {
  12. lowcost[i]=cost[][i];
  13. path[i]=;
  14. }
  15. lowcost[]=;
  16. path[]=-;
  17. int pre= ;
  18. for( i= ; i<n ;i++)
  19. {
  20. min=inf;
  21. for(j= ; j<n ;j++)
  22. {
  23. if(vis[j]==&&lowcost[pre]+cost[pre][j]<lowcost[j])
  24. {
  25. lowcost[j]=lowcost[pre]+cost[pre][j];
  26. path[j]=pre;
  27. }
  28. }
  29. for(j=; j<n ;j++)
  30. {
  31. if(vis[j]==&&lowcost[j]<min)
  32. {
  33. min=lowcost[j];
  34. pre=j;
  35. }
  36. }
  37. vis[pre]=;
  38. }
  39. printf("%d\n",lowcost[n-]);
  40. }
  41.  
  42. int main()
  43. {
  44. int n,m,x,y,val,i,j;
  45. while(scanf("%d%d",&n,&m),n+m)
  46. {
  47. for(i=;i<n;i++)
  48. {
  49. for(j=;j<n;j++)
  50. {
  51. sta[i][j]=inf;
  52. }
  53. }
  54. while(m--)
  55. {
  56. scanf("%d%d%d",&x,&y,&val);
  57. sta[y-][x-]=sta[x-][y-]=val;
  58. }
  59. Dijkstra(sta,n);
  60. }
  61. return ;
  62. }

采用以为数组,时间复杂度将为O(n*long(n));

代码:

  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<queue>
  6. using namespace std;
  7. const int inf=0x3f3f3f3f;
  8. const int tol=;
  9. const int edg=;
  10. int cost[edg],dist[tol]; /* <distance> */
  11. int e,pnt[edg],nxt[edg],prev[tol],head[tol],vis[tol];
  12. struct qnode{
  13. int v ,c;
  14. qnode(int vv= ,int cc=):v(vv),c(cc){};
  15. bool operator <(const qnode& r)const
  16. {
  17. return c>r.c;
  18. }
  19. };
  20.  
  21. void Dijkstra(int n , const int src) /* <src出发点> */
  22. {
  23. qnode mv ; //充当一个临时变量
  24. int i,j,k,pre;
  25. priority_queue<qnode>que ; /*<priority—>优先队列>*/
  26. vis[src]=;
  27. dist[src]=;
  28. que.push( qnode(src,) );
  29. for( pre=src,i=; i<n; i++)
  30. {
  31. for(j=head[pre] ; j!=- ;j=nxt[j])
  32. {
  33. k=pnt[j];
  34. if(vis[k]==&&dist[pre]+cost[j]<dist[k])
  35. {
  36. dist[k]=dist[pre]+cost[j];
  37. que.push( qnode(pnt[j], dist[k]) );
  38. prev[k]=pre;
  39. }
  40. }
  41. while(!que.empty() && vis[que.top().v]==)
  42. {
  43. que.pop();
  44. }
  45. if(que.empty())break;
  46. mv=que.top();
  47. que.pop();
  48. pre=mv.v;
  49. vis[pre]=;
  50. }
  51. }
  52. inline void addedge( int u ,int v,int c)
  53. {
  54. pnt[e]=v;
  55. cost[e]=c;
  56. nxt[e]=head[u];
  57. head[u]=e++;
  58.  
  59. }
  60.  
  61. void init(int nv ,int ne)
  62. {
  63. int i,u,v;
  64. int c;
  65. e=;
  66. memset(head,-,sizeof(head));
  67. memset(vis,,sizeof(vis));
  68. memset(prev,-,sizeof(prev));
  69. for(i=; i<nv ; i++)
  70. dist[i]=inf;
  71. for(i=; i<ne ;i++)
  72. {
  73. scanf("%d%d%d",&u,&v,&c);
  74. addedge(u-,v-,c);
  75. addedge(v-,u-,c);
  76. }
  77.  
  78. }
  79. int main()
  80. {
  81. int n,m;
  82. while(scanf("%d%d",&n,&m),n+m)
  83. {
  84. init(n,m);
  85. Dijkstra(n,);
  86. printf("%d\n",dist[n-]);
  87. }
  88. return ;
  89. }

HDUOJ --2544最短路(基础)的更多相关文章

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

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

  2. hdu 2544 最短路

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

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

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

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

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

  5. HUD.2544 最短路 (Dijkstra)

    HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...

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

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

  7. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  8. hdoj 2544 最短路

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2544 分析:Dijkstra算法 //2013-10-30 10:01:25 Accepted 254 ...

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

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

随机推荐

  1. Unity3d-Particle System 5.x系统的学习(四)

    Unity3d-Particle System 5.x系统的学习(四) 今天,我们来聊聊unity5.x的粒子系统和unity4.x粒子系统的区别. 我大致看了下,区别还是蛮多的,但是总体的粒子制作思 ...

  2. MICS:副本和纠删码混合存储系统

    摘要 云存储系统的三个指标: 高可靠性,低存储开销,高读写性能. 这三个指标是没有办法同一时候满足的,许多时候须要进行tradeoff. 副本系统和纠删码是两种在存储系统中广泛使用的策略,它们在保证高 ...

  3. 深入理解Java中的组合和继承

    Java是一个面向对象的语言.每一个学习过Java的人都知道,封装.继承.多态是面向对象的三个特征.每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用.所以,很多开发人 ...

  4. OpenCV学习(30) 轮廓defects

    上一篇教程中,我们学习了如何计算轮廓的凸包,其实对一个轮廓而言,可能它的凸包和它本身是重合的,也有可能不是重合的.比如下面左边图像的轮廓本身就是凸包,而右边图像的轮廓则不是.我们可以通过函数bool ...

  5. 数学图形之克莱因瓶(klein bottle)

    克莱因瓶是一种内外两面在同一个曲面上的图形. 在数学领域中,克莱因瓶(德语:Kleinsche Flasche)是指一种无定向性的平面,比如二维平面,就没有“内部”和“外部”之分.克莱因瓶最初的概念提 ...

  6. UVA 400 (13.08.05)

     Unix ls  The computer company you work for is introducing a brand new computer line and is developi ...

  7. TypeError: 'newline' is an invalid keyword argument for this function 错误解决

    出错代码: outputFile = open('output1.csv', 'w', newline='') # error line outputWriter = csv.writer(outpu ...

  8. BZOJ 3172 Tjoi2013 单词 后缀数组

    题目大意:给定一个n个单词的文章,求每一个单词在文章中的出现次数 文章长度<=10^6(不是单词长度<=10^6,不然读入直接超时) 首先将全部单词用空格连接成一个字符串.记录每一个单词的 ...

  9. 一段遍历4X4表格,取出每个单元格内容组合成文本的JS代码

    遍历表格的JS容易忘,留个随笔以备忘. var tableData="";    var table=document.getElementById("XXTableId ...

  10. ZH奶酪:PHP判断图片格式的7种方法

    以图片 $imgurl = "http://www.php10086.com/wp-content/themes/inove/img/readers.gif"; 为例: 思路1. ...