uva 10801 - Lift Hopping(最短路Dijkstra)
生活随笔
收集整理的這篇文章主要介紹了
uva 10801 - Lift Hopping(最短路Dijkstra)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 /*
2 題目大意:
3 就是一幢大廈中有0~99的樓層, 然后有1~5個電梯!每個電梯有一定的上升或下降速度和樓層的停止的位置!
4 問從第0層樓到第k層最少經(jīng)過多長時間到達(dá)!
5
6 思路:明顯的Dijkstra ,在建圖的時候u->v可能有多個電梯到達(dá),取時間最少的當(dāng)作路徑的權(quán)值!
7 如果我們發(fā)現(xiàn) d[i] > d[j] + map[j][i] + 60, 那么說明從第0層到達(dá)第 i 層的時間大于從第j層
8 轉(zhuǎn)移到其他電梯然后到達(dá)第 i 層的時間,那么就更新d[i]的值!
9
10 */
11 #include<iostream>
12 #include<cmath>
13 #include<cstring>
14 #include<cstdio>
15 #include<algorithm>
16
17 using namespace std;
18 const int INF = 0x3f3f3f3f;
19 int map[105][105];
20 int d[105];
21 int t[5];
22 int lift[105];
23 int vis[105];
24 int n, k;
25
26 void addEdge(int a, int b, int tt){
27 int dist=abs(a-b)*tt;
28 if(map[a][b]>dist)
29 map[a][b]=map[b][a]=dist;
30 }
31
32 void Dijkstra(){
33 int root=0, p;
34 memset(vis, 0, sizeof(vis));
35 vis[0]=1;
36 for(int i=1; i<=99; ++i){
37 int minLen=INF;
38 for(int j=1; j<=99; ++j){
39 if(!vis[j] && d[j] > d[root]+map[root][j]+60)
40 d[j] = d[root]+map[root][j]+60;
41 if(!vis[j] && minLen>d[j]){
42 minLen=d[j];
43 p=j;
44 }
45 }
46 if(minLen==INF)
47 return ;
48 root=p;
49 vis[root]=1;
50 }
51 }
52
53 int main(){
54 while(scanf("%d%d", &n, &k)!=EOF){
55 memset(map, 0x3f, sizeof(map));
56 memset(d, 0x3f, sizeof(d));
57 d[0]=0;
58 for(int i=1; i<=n; ++i)
59 scanf("%d", &t[i]);
60 char ch;
61
62 for(int i=1; i<=n; ++i){
63 int cnt=0;
64 while(1){
65 scanf("%d%c", &lift[cnt++], &ch);
66 for(int j=0; j<cnt-1; ++j)
67 addEdge(lift[cnt-1], lift[j], t[i]);
68
69 if(ch=='\n')
70 break;
71 }
72 }
73
74 Dijkstra();
75
76 if(k==0)
77 printf("0\n");
78 else if(d[k]!=INF)
79 printf("%d\n", d[k]-60);
80 else printf("IMPOSSIBLE\n");
81 }
82 return 0;
83 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/3900059.html
總結(jié)
以上是生活随笔為你收集整理的uva 10801 - Lift Hopping(最短路Dijkstra)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces Round #32
- 下一篇: iso如何安装到u盘安装系统文件怎么打开