uva 10801(dijkstra)

题意:一个人在大楼的0楼,大楼最多到99层,有n部电梯每部电梯有可到达的楼层每个电梯移动一层的时间为T[i]秒换电梯的时间为60秒,给你一个楼层问你电梯到这个楼层的最短路径。

思路:很容易看出是一个最短路问题,关键在于如何建图,首先我们分析一下我们很容易想到把楼层当作点把时间当左边,但是有一个问题由于它涉及楼层中换电梯所以这样做的话我们就无法计算换电梯的时间,所以我的方法是把一个楼层拆成n个点(这样做的前提是在这道题中n比较小<=5)分别表示从哪一个电梯下来的。然后再把相同楼层的点之间加一条长度为60的边。这样再通过执行n次Dijkstra算法去最小值得出答案。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #define INF 500001
11 #define LEN 610
12 using namespace std;
13 
14 typedef pair<int, int> pii;
15 vector<pii> Map[LEN];
16 int dis[LEN];
17 
18 void Dijkstra(int vex){
19     priority_queue<pii, vector<pii>, greater<pii> > q;
20     int vis[LEN] = {0};
21     for(int i=0; i<LEN; i++) dis[i] = (i==vex?0:INF);
22     q.push(make_pair(dis[vex], vex));
23     while(!q.empty()){
24         pii nv = q.top(); q.pop();
25         int x = nv.second;
26         if(vis[x]) continue;
27         vis[x] = 1;
28         for(vector<pii>::iterator it = Map[x].begin(); it!=Map[x].end(); ++it){
29             int y = it->first, v = it->second;
30             if(dis[y]>dis[x]+v){
31                 dis[y] = dis[x]+v;
32                 q.push(make_pair(dis[y], y));
33             }
34         }
35     }
36 }
37 
38 int main()
39 {
40 //    freopen("in.txt", "r", stdin);
41 
42     int n, K, sp[LEN], avi[LEN];
43     while(scanf("%d%d", &n, &K)!=EOF){
44         for(int i=0; i<LEN; i++)Map[i].clear();
45         for(int i=0; i<n; i++){
46             scanf("%d", &sp[i]);
47         }
48         for(int i=0; i<n; i++){
49             int top = 0;
50             while(scanf("%d", &avi[top++])!=EOF)
51                 if(getchar()=='\n')break;
52             int idx = i*100;
53             for(int j=0; j<top; j++){
54                 for(int k=j+1; k<top; k++){
55                     Map[idx+avi[j]].push_back(make_pair(idx+avi[k], (avi[k]-avi[j])*sp[i]));
56                     Map[idx+avi[k]].push_back(make_pair(idx+avi[j], (avi[k]-avi[j])*sp[i]));
57                 }
58             }
59         }
60         for(int i=0; i<100; i++){
61             for(int j=0; j<n; j++){
62                 for(int k=0; k<n; k++){
63                     Map[j*100+i].push_back(make_pair(k*100+i, 60));
64                     Map[k*100+i].push_back(make_pair(j*100+i, 60));
65                 }
66             }
67         }
68         int ans = INF;
69         for(int i=0; i<n; i++){
70             Dijkstra(0+i*100);
71             for(int j=0; j<n; j++) ans = min(ans, dis[K+j*100]);
72         }
73         if(ans==INF) printf("IMPOSSIBLE\n");
74         else printf("%d\n", ans);
75     }
76     return 0;
77 }
View Code

 

posted @ 2013-12-09 22:00  张小豪  阅读(449)  评论(0编辑  收藏  举报