UVa 10801 - Lift Hopping
2012-11-27 23:02
323 查看
根据题意,以每一层楼为顶点,每个电梯可以到达的两层楼之间的秒数为每一条边的权值,以此构建一个无向图。然后利用dijkstra求出最短的时间,注意每次换乘电梯需要等待60s(因为同一个电梯上的楼层是相互可达的,所以我们只有通过另外一个电梯找到了更小的搭乘时间时候我们才会执行松弛操作),因此每转一个定点需要加60s时间(注意初始定点不需要60s的等待)。
代码如下:
代码如下:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; const int MAXN = 105, INF = 1000000; int speed[MAXN], floors[MAXN]; int w[MAXN][MAXN], d[MAXN]; int n, k, num; bool vis[MAXN]; void build_G(int ss)//构造无向图 { for(int i=0; i<num; i++) for(int j=i+1; j<num; j++) { int dis = abs(floors[i]-floors[j]) * speed[ss]; if(dis < w[floors[i]][floors[j]]) w[floors[i]][floors[j]] = w[floors[j]][floors[i]] = dis; } } void dijkstra() { memset(vis, false, sizeof(vis)); for(int i = 0; i < 100; i++) d[i] = (i == 0) ? 0 : INF; for(int i = 0; i < 100; i++) { int x, m = INF; for(int y = 0; y < 100; y++) if(!vis[y] && d[y] < m) m = d[x=y]; vis[x] = true; for(int y = 0; y < 100; y++) if(d[y] > d[x] + w[x][y] + 60)//每个换乘顶点均等待60s d[y] = d[x] + w[x][y] + 60; } if(d[k] == INF) printf("IMPOSSIBLE\n"); else { if(k == 0) puts("0"); else printf("%d\n", d[k]-60);//减去初始顶点的60s } } int main() { #ifdef test freopen("sample.txt", "r", stdin); #endif while(scanf("%d%d", &n, &k) != EOF) { memset(w, INF, sizeof(w)); for(int i=0; i<n; i++) scanf("%d", &speed[i]); for(int i=0; i<n; i++) { num = 0; while(1) { scanf("%d", &floors[num++]); if(getchar() == '\n') break; } build_G(i); } dijkstra(); } return 0; }
相关文章推荐
- UVA 10801 Lift Hopping Floyd
- uva 10801 Lift Hopping
- UVA 10801 Lift Hopping
- Lift Hopping, UVa 10801【Floyd】
- UVa 10801 Lift Hopping / floyd
- Lift Hopping UVA - 10801
- Lift Hopping - UVa 10801 Floyd
- UVa 10801 Lift Hopping / floyd
- 习题11-7 UVa 10801 Lift Hopping SPFA最短路
- UVA- 10841 - Lift Hopping in the Real World(dijkstra)
- 10801 - Lift Hopping//Bellman-Ford
- (intermediate) 最短路 UVA 10841 - Lift Hopping in the Real World
- uva 10801
- [UVA 10801]Lift Hopping[Dijkstra][建图]
- UVA 10801(p381)----Lift Hopping
- UVa 10801 Lift Hopping (Dijkstra)
- uva 10801(最短路)
- UVA 821 Page Hopping 网页跳跃(BFS,简单)
- UVa 10801 电梯换乘
- UVA 10801 Lift Hopping