[关闭]
@laofang 2016-06-30T04:43:04.000000Z 字数 1362 阅读 1267

最短路径 dijkstra

java


Description
目前网络上电子地图的使用很普遍。利用电子地图可以很方便地确定从一个地点到另一个地点的路径。特别地,可确定在城市中的公交换乘路线。
电子地图可以看成是一个图,而公交线路图可看成是带权有向图G =(V,E),其中每条边的权是非负实数。
最短路径问题:计算从给定的起点s到另一个顶点t的最短路径的长度。
你的任务:对给定的一个(无向)图G,及G中的两点s、t,计算从起点s到顶点t的最短距离。
Input
输入文件中有若干组测试数据(组数不超过20)。
每组测试数据的第1行是一个正整数n,表示地图G的顶点数,n<50。
接下来的n行采用邻接矩阵方式描述这一个地图,第i行有n个数,依次表示第i个顶点与第1、2、3、…、n个顶点的路径长。假如两个顶点间无边相连,用一个-1表示。相邻的两个整数之间用空格隔开。注意,图中每个顶点 i处都没有自己到自己的边。
再在下面的一行上给出两个整数s、t,表示上述地图上的两个顶点。
每组测试数据之间有一空行。
输入直到文件结束。
Output
对输入中的每个城市地图,先在一行上输出“Case #”,其中“#”是测试数据的组号(从1开始),再在下一行输出从顶点s到顶点t的最短距离。
Sample Input
4
-1 2 -1 4
2 -1 3 -1
-1 3 -1 2
4 -1 2 -1
1 3

5
-1 10 -1 30 100
-1 -1 50 -1 -1
-1 -1 -1 -1 10
-1 -1 20 -1 60
-1 -1 -1 -1 -1
1 5
Sample Output
Case 1
5
Case 2
60

C++实现

  1. #include<iostream>
  2. #include<math.h>
  3. #include<vector>
  4. #include<memory.h>
  5. using namespace std;
  6. #define inf 1e9+7
  7. const int N = 55;
  8. int G[N][N];
  9. int dis[N];
  10. bool book[N];
  11. int main(){
  12. int n;
  13. int tcase=0;
  14. while(cin >> n){
  15. for(int i=0; i<N; i++){
  16. memset(G[i],0,sizeof(G[i]));
  17. }
  18. for(int i=0;i<n;i++){
  19. for(int j=0; j<n; j++){
  20. cin >> G[i][j];
  21. if(G[i][j] == -1){
  22. G[i][j] = i==j?0:inf;
  23. }
  24. }
  25. }
  26. int s,t;
  27. cin >> s >> t;
  28. s--;t--;
  29. memset(dis,0,sizeof(dis));
  30. memset(book,0,sizeof(book));
  31. for(int i=0; i<n; i++){
  32. dis[i] = G[s][i];
  33. }
  34. book[s] = true;
  35. int u=0;
  36. for(int i=0; i<n; i++){
  37. //找到当前最短路
  38. int min = inf;
  39. for(int j=0; j<n; j++){
  40. if(!book[j] && dis[j]<min){
  41. min = dis[j];
  42. u = j;
  43. }
  44. }
  45. book[u] = true;
  46. //更新最短路
  47. for(int v=0; v<n; v++){
  48. if(G[u][v]<inf){
  49. if(dis[u]+G[u][v] < dis[v]){
  50. dis[v] = dis[u]+G[u][v];
  51. }
  52. }
  53. }
  54. }
  55. cout << "Case " << ++tcase << endl;
  56. cout << dis[t] << endl;
  57. }
  58. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注