Bus System(Flody)
http://acm.hdu.edu.cn/showproblem.php?pid=1690
坑爹的题,必须用__int64 %I64d(以前没用过)
因为这题的数据特别大,所以用-1
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <math.h> 6 using namespace std; 7 __int64 map[102][102]; 8 __int64 L[5],C[5]; 9 __int64 a[102]; 10 int n,m; 11 void Floy() 12 { 13 for(int k=1;k<=n;k++) 14 { 15 for(int i=1;i<=n;i++) 16 { 17 for(int j=1;j<=n;j++) 18 { 19 if(map[i][k]==-1||map[k][j]==-1)// 20 continue; 21 if(map[i][j]==-1||map[i][k]+map[k][j]<map[i][j])//执行这步,说明map[i][k],map[k][j]都存在 22 map[i][j]=map[i][k]+map[k][j]; 23 } 24 } 25 } 26 } 27 28 int main() 29 { 30 int T; 31 int K=0; 32 scanf("%d",&T); 33 while(T--) 34 { 35 K++; 36 for(int i=1;i<=4;i++) 37 scanf("%I64d",&L[i]); 38 for(int i=1;i<=4;i++) 39 scanf("%I64d",&C[i]); 40 scanf("%d%d",&n,&m); 41 for(int i=1;i<=n;i++) 42 { 43 scanf("%I64d",&a[i]); 44 } 45 __int64 t; 46 for(int i=1;i<=n;i++) 47 { 48 for(int j=1;j<=n;j++) 49 { 50 51 t=abs(a[j]-a[i]);//这里自己出错了,输入时坐标是不会按顺序输入的 52 53 if(t==0) 54 { 55 map[i][j]=0; 56 map[j][i]=0; 57 } 58 else if(t>0&&t<=L[1]) 59 { 60 map[i][j]=C[1]; 61 map[j][i]=C[1]; 62 63 } 64 else if(t>L[1]&&t<=L[2]) 65 { 66 map[i][j]=C[2]; 67 map[j][i]=C[2]; 68 69 } 70 else if(t>L[2]&&t<=L[3]) 71 { 72 73 74 map[i][j]=C[3]; 75 map[j][i]=C[3]; 76 77 } 78 else if(t>L[3]&&t<=L[4]) 79 { 80 81 82 map[i][j]=C[4]; 83 map[j][i]=C[4]; 84 85 } 86 else 87 { 88 map[i][j]=-1; 89 map[j][i]=-1; 90 } 91 92 } 93 } 94 Floy(); 95 printf("Case %d:\n",K); 96 int yy,uu; 97 for(int i=0;i<m;i++) 98 { 99 scanf("%d%d",&yy,&uu); 100 if(map[yy][uu]==-1) 101 printf("Station %d and station %d are not attainable.\n",yy,uu); 102 else 103 { 104 printf("The minimum cost between station %d and station %d is %I64d.\n",yy,uu,map[yy][uu]); 105 106 } 107 } 108 109 } 110 return 0; 111 }