[关闭]
@lawk97 2017-05-27T09:40:03.000000Z 字数 1025 阅读 1043

寒假专题训练--最短路

最短路


A - 最短路

[HDU - 2544]

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <string>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. using namespace std;
  11. #define INF 1000005
  12. int n,m,dir,minx,now;
  13. int used[155],sl[155],gra[155][155];
  14. int be,st;
  15. int main(){
  16. while(scanf("%d%d",&n,&m),n!=0&&m!=0){
  17. minx=INF;
  18. memset(sl,0,sizeof(sl));
  19. memset(used,0,sizeof(used));
  20. for (int i = 0; i < 155; ++i)
  21. {
  22. for (int j = 0; j < 155; ++j)
  23. {
  24. gra[i][j]=INF;
  25. if (i==j)
  26. {
  27. gra[i][j]=0;
  28. }
  29. }
  30. }
  31. for(int i=0;i<m;i++){
  32. cin>>be>>st>>dir;
  33. if (gra[be][st]>dir)
  34. {
  35. gra[be][st]=dir;
  36. gra[st][be]=dir;//no direction
  37. }
  38. }
  39. if (n==1)
  40. {
  41. printf("0\n");
  42. continue;
  43. }
  44. for(int i=1;i<=n;i++){
  45. sl[i]=gra[1][i];
  46. }
  47. used[1]=1;
  48. now=1;
  49. //now must have initial value,if the begin point can't connect to others,
  50. for (int i = 2; i <= n; ++i)
  51. {
  52. minx=INF;
  53. for(int j=1;j<=n;j++){
  54. if (!used[j]&&sl[j]<minx)
  55. {
  56. now=j;
  57. minx=sl[j];
  58. }
  59. }
  60. used[now]=1;
  61. for (int j = 1; j <=n; ++j)
  62. {
  63. if (!used[j]&&sl[now]+gra[now][j]<sl[j])
  64. {
  65. sl[j]=sl[now]+gra[now][j];
  66. }
  67. }
  68. }
  69. if (sl[n]<INF)
  70. {
  71. printf("%d\n",sl[n] );
  72. }else{
  73. printf("-1\n");
  74. }
  75. }
  76. return 0;
  77. }

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注