HDU 1548 A strange lift (Dijkstra)
https://vjudge.net/problem/HDU-1548
题意:
电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。
思路:
可以用BFS,也可以用迪杰斯特拉算法。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 7 #define INF 100000000 8 9 int n, A, B; 10 int map[205][205]; 11 int vis[205]; 12 int d[205]; 13 int num[205]; 14 15 void Dijkstra() 16 { 17 memset(vis, 0, sizeof(vis)); 18 for (int i = 1; i <= n; i++) 19 { 20 num[i] = map[A][i]; 21 } 22 num[A] = 0; 23 vis[A] = 1; 24 for (int i = 1; i < n; i++) 25 { 26 int min = INF; 27 int pos; 28 for (int j = 1; j <= n; j++) 29 { 30 if (num[j] < min && !vis[j]) 31 { 32 pos = j; 33 min = num[j]; 34 } 35 } 36 if (min == INF) break; 37 vis[pos] = 1; 38 for (int j = 1; j <= n; j++) 39 { 40 if (num[pos] + map[pos][j] < num[j] && !vis[j]) 41 num[j] = num[pos] + map[pos][j]; 42 } 43 } 44 if (num[B] == INF) printf("-1\n"); 45 else printf("%d\n", num[B]); 46 } 47 48 int main() 49 { 50 //freopen("D:\\txt.txt", "r", stdin); 51 int a; 52 while (scanf("%d", &n) && n) 53 { 54 scanf("%d%d", &A, &B); 55 for (int i = 1; i <= n; i++) 56 for (int j = 1; j <= n; j++) 57 map[i][j] = INF; 58 for (int i = 1; i <= n; i++) 59 { 60 scanf("%d", &a); 61 if (i + a <= n) 62 map[i][i + a] = 1; 63 if (i - a >= 0) 64 map[i][i - a] = 1; 65 } 66 Dijkstra(); 67 } 68 return 0; 69 }