这是一个简单的最短路问题。题意:给定有N个地点(编号从1到N),T条道路,先输入两个正整数T和N,然后接下来T行,每行三个整数,分别代表这条道路的起点终点和长度。要求求出从N到1的最短路、、、
解法:不能用Floyd,因为节点达到了1000,Floyd的时间复杂度为O(n的三次方),会TLE。用普通的Dijkstra就行了。
注意:题目数据有些坑、、、题目意思是说道路最大长度不超过100,但是实际上可能达到了几十万,因此建议将最大值调大一些。而且,输入会有重边,这点很容易忽略。另外,此题是多case的。
接下来是解题代码:Dijkstra解法
1 #include <stdio.h> 2 #define N 2001 3 #define MAX 99999999 4 5 int map[N][N]; //建立图,map[i][j]代表i到j的距离 6 int dis[N]; //dis[i]代表起点到i的距离 7 int flag[N]; //标记变量 8 int t, n; 9 10 void Init(); //初始化 11 12 void Read(); //输入 13 14 void Dijkstra(); 15 16 int main() 17 { 18 while (~scanf("%d %d", &t, &n)) 19 { 20 Init(); 21 Read(); 22 Dijkstra(); 23 printf("%d\n", dis[1]); 24 } 25 return 0; 26 } 27 28 void Init() //初始化 29 { 30 int i, j; 31 for (i=0; i<N; i++) 32 { 33 for (j=0; j<N; j++) 34 { 35 map[i][j] = MAX; 36 } 37 flag[i] = 0; 38 dis[i] = MAX; 39 } 40 return; 41 } 42 43 void Read() //输入 44 { 45 int i; 46 int a, b, len; 47 for (i=0; i<t; ++i) 48 { 49 scanf("%d %d %d", &a, &b, &len); 50 if (map[a][b] > len) //解决重边问题 51 { 52 map[a][b] = map[b][a] = len; 53 } 54 } 55 return; 56 } 57 58 void Dijkstra() 59 { 60 int i, j, k; 61 int min; 62 dis[n] = 0; 63 for (i=1; i<=n; ++i) 64 { 65 min = MAX; 66 for (j=1; j<=n; ++j) 67 { 68 if (flag[j] == 0 && dis[j] < min) 69 { 70 min = dis[k = j]; 71 } 72 } 73 flag[k] = 1; 74 for (j=1; j<=n; ++j) 75 { 76 if (dis[j] > dis[k] + map[k][j]) 77 { 78 dis[j] = dis[k] + map[k][j]; 79 } 80 } 81 } 82 return; 83 }