标签:des style blog http java color
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6166 Accepted Submission(s): 1580
题意:坐公交车不同的距离,所需要的花费是不一样的,给你8个数,前4个代表不同的距离,后4个代表的是相应的花费,若距离不在所规定的范围,则不能到达吧。再输入n和m,分别表示在坐标上有n个点,代表不同的坐标值,m则代表将要询问的最短路的次数了。
解题思路:就是一道dijkstra或floyd的模板题,但要注意数据的大小,要用int64位来计算,而且定义的最大值的是非常大的数。一开始我定义为2^32-1,但结果WA了,后面改了就可以了。
Dijkstra贴代码:
#include <stdio.h> #define maxn 1e18 __int64 map[105][105], dis[105]; int visited[105]; void Dijkstra(int start, int n) { __int64 mind; int pre = start; for(int i = 1; i<=n; i++) { dis[i] = map[start][i]; visited[i] = 0; } visited[start] = 1; for(int i = 1; i<=n; i++) { mind = maxn; for(int j = 1; j<=n; j++) { if(!visited[j] && mind > dis[j]) { mind = dis[j]; pre = j; } } visited[pre] = 1; for(int j = 1; j<=n; j++) { if(!visited[j] && dis[j] > dis[pre]+map[pre][j]) dis[j] = dis[pre]+map[pre][j]; } } } int main() { __int64 x, N[105]; int t = 1, T; int n, m; int start, finish; __int64 L1, L2, L3, L4, C1, C2, C3, C4; scanf("%d", &T); while(T--) { scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &L1, &L2, &L3, &L4, &C1, &C2, &C3, &C4); scanf("%d%d", &n, &m); for(int i = 1; i<=n; i++) scanf("%I64d", &N[i]); for(int i = 1; i<=n; i++) { for(int j = 1; j<=n; j++) { if(N[i] > N[j]) x = N[i] - N[j]; else x = N[j] - N[i]; if(x>0 && x<=L1) map[i][j] = C1; else if(x>L1 && x<=L2) map[i][j] = C2; else if(x>L2 && x<=L3) map[i][j] = C3; else if(x>L3 && x<=L4) map[i][j] = C4; else map[i][j] = maxn; if(i == j) map[i][j] = 0; } } printf("Case %d:\n", t++); while(m--) { scanf("%d%d", &start, &finish); Dijkstra(start, n); if(visited[finish]) printf("The minimum cost between station %d and station %d is %I64d.\n", start, finish, dis[finish]); else printf("Station %d and station %d are not attainable.\n", start, finish); } } return 0; }
Floyd算法的代码:
#include <stdio.h> #define maxn 1e18 __int64 map[105][105], dis[105]; void Floyd(int n) { for(int k = 1; k<=n; k++) { for(int i = 1; i<=n; i++) { for(int j = 1; j<=n; j++) { if(map[i][j] > map[i][k]+map[k][j]) map[i][j] = map[i][k]+map[k][j]; } } } } int main() { __int64 x, N[105]; int t = 1, T; int n, m; int start, finish; __int64 L1, L2, L3, L4, C1, C2, C3, C4; scanf("%d", &T); while(T--) { scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &L1, &L2, &L3, &L4, &C1, &C2, &C3, &C4); scanf("%d%d", &n, &m); for(int i = 1; i<=n; i++) scanf("%I64d", &N[i]); for(int i = 1; i<=n; i++) { for(int j = 1; j<=n; j++) { if(N[i] > N[j]) x = N[i] - N[j]; else x = N[j] - N[i]; if(x>0 && x<=L1) map[i][j] = C1; else if(x>L1 && x<=L2) map[i][j] = C2; else if(x>L2 && x<=L3) map[i][j] = C3; else if(x>L3 && x<=L4) map[i][j] = C4; else map[i][j] = maxn; if(i == j) map[i][j] = 0; } } Floyd(n); printf("Case %d:\n", t++); while(m--) { scanf("%d%d", &start, &finish); if(map[start][finish] != maxn) printf("The minimum cost between station %d and station %d is %I64d.\n", start, finish, map[start][finish]); else printf("Station %d and station %d are not attainable.\n", start, finish); } } return 0; }
hdu 1960 Bus System,布布扣,bubuko.com
标签:des style blog http java color
原文地址:http://www.cnblogs.com/fengxmx/p/3840473.html