描述

罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。

现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。


格式

输入格式

输入n, m,表示n个城市和m条路;

接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。

输出格式

输出1到n的最短路。如果1到达不了n,就输出-1。


样例

输入样例

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

输出样例

90


限制

时间限制:1000 ms
内存限制:65536 KB


代码

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