题目地址:点击打开链接
思路:水题吧,dist[4],cost[4],loc[110];都得用__int64,我看不会超int结果就用int,wrong了
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> using namespace std; const __int64 maxn = 4e18;//后面不能用加号,貌似会出错 __int64 dist[4],cost[4],loc[110]; __int64 map1[110][110]; int n,m; void Floyed() { int i,j,k; for(k=1; k<=n; k++) { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(map1[i][j] > map1[i][k] + map1[k][j]) { map1[i][j] = map1[i][k] + map1[k][j]; } } } } } int main() { int i,j; int t,l = 1; __int64 x; scanf("%d",&t); while(t--) { for(i=0; i<4; i++) { scanf("%I64d",&dist[i]); } for(i=0; i<4; i++) { scanf("%I64d",&cost[i]); } scanf("%d%d",&n,&m); for(i=1; i<=n; i++) { scanf("%I64d",&x); loc[i] = x; } for(i=1; i<=n; i++) { for(j=1; j<=n; j++)//这里初始化不太好,第二个应该为for(j=i+1; j<=n; j++),下面的语句建成双向图即可 { map1[i][j] = abs(loc[i] - loc[j]); if(map1[i][j] > 0 && map1[i][j] <= dist[0]) { map1[i][j] = cost[0]; } else if(map1[i][j] > dist[0] && map1[i][j] <= dist[1]) { map1[i][j] = cost[1]; } else if(map1[i][j] > dist[1] && map1[i][j] <= dist[2]) { map1[i][j] = cost[2]; } else if(map1[i][j] > dist[2] && map1[i][j] <= dist[3]) { map1[i][j] = cost[3]; } else { map1[i][j] = maxn; } } } Floyed(); int start,end1; printf("Case %d:\n",l++); for(i=0; i<m; i++) { scanf("%d%d",&start,&end1); if(map1[start][end1] != maxn) { printf("The minimum cost between station %d and station %d is %I64d.\n",start,end1,map1[start][end1]); } else { printf("Station %d and station %d are not attainable.\n",start,end1); } } } return 0; }