您的位置:首页 > 其它

uva 10801(最短路径)

2014-11-07 20:14 281 查看
题意:有n个电梯和电梯各自的速度和能够到达的层数,一个人从0层开始坐电梯,给出一个目标层,要求输出最短时间达到目标层的时间,如果中间需要换电梯,需要等待60秒,如果无法达到输出Impossible。

题解:先构图,将结点之间的连通的最优情况存在二维数组g中,因为起点固定,用dijkstra算法,然后在更新dist数组(保存从起点到各个点的最短时间),dist[j] = min{dist[j], dist[i] + g[i][j] + 60},默认从0层开始坐电梯也加了60,所以如果目标层是0层需要特判。

#include <stdio.h>
#include <string.h>
const int N = 100;
const int INF = 0x3f3f3f3f;

int g

, n, k, t[5], vis
, dist
, prev
, ele
;

void dijkstra() {
memset(vis, 0, sizeof(vis));
memset(dist, INF, sizeof(dist));
dist[0] = 0;
for (int i = 0; i < N; i++) {//可能有坐电梯下降到目标层的情况,所以是N而不是k
int minn = INF, index;
for (int j = 0; j < N; j++) {
if (!vis[j] && dist[j] < minn) {
minn = dist[j];
index = j;
}
}
vis[index] = 1;
for (int j = 0; j < N; j++)
if (dist[index] + g[index][j] + 60 < dist[j]) {
dist[j] = dist[index] + g[index][j] + 60;
}
}
}

int main() {
while (scanf("%d%d", &n, &k) != EOF) {
memset(g, INF, sizeof(g));
for (int i = 0; i < n; i++)
scanf("%d", &t[i]);
for (int i = 0; i < n; i++) {
char c;
int temp = 0;
while (scanf("%d%c", &ele[temp++], &c) && c == ' ');
for (int j = 0; j < temp; j++)
for (int k = j; k < temp; k++) {
int temp2 = (ele[k] - ele[j]) * t[i];
if (temp2 < g[ele[k]][ele[j]])
g[ele[k]][ele[j]] = g[ele[j]][ele[k]] = temp2;
}
}
if (k == 0) {
printf("0\n");
continue;
}
dijkstra();
if (dist[k] < INF)
printf("%d\n", dist[k] - 60);
else
printf("IMPOSSIBLE\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva dijkstra