HDU 1690 Bus System(Floyd)
这个题,错了10+,不过还是挺值得的,发现了两个我的Floyd模版的两个问题,一个是初始化的数必须绝对的大,然后就是在判断句的时候
if(p[i][j] > p[i][k] + p[k][j] && p[i][k] != N && p[k][j] != N) 以前不注意不写后边的两个&&,做这个题,发现在数据很大的时候会出错。。。血的教训啊。。。以后写Floyd一定要注意。。。。和AC代码 一句一句的比对啊。。。。
1 #include <stdio.h> 2 #include <string.h> 3 #include<math.h> 4 #define N 0x7f7f7f7f7f7f7f7fLL//从网上找的这条句子。。。 5 __int64 p[501][501],s[501]; 6 int main() 7 { 8 int i,j,k,n,m,t,sv,ev,num = 0; 9 __int64 l1,l2,l3,l4,c1,c2,c3,c4; 10 __int64 sum,ss; 11 scanf("%d",&t); 12 while(t--) 13 { 14 num ++; 15 scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&l1,&l2,&l3,&l4,&c1,&c2,&c3,&c4); 16 scanf("%d%d",&n,&m); 17 for(i = 1; i <= n; ++i ) 18 for(j = 1; j <= n; ++j ) 19 { 20 if(i != j) 21 p[i][j] = N; 22 else 23 p[i][j] = 0; 24 } 25 for(i = 1; i <= n; ++i ) 26 { 27 scanf("%I64d",&s[i]); 28 } 29 for(i = 1; i <= n; ++i ) 30 for(j = 1; j <= n; ++j ) 31 { 32 if(i != j) 33 { 34 sum = s[i]-s[j]; 35 if(sum < 0) 36 sum = -sum; 37 if(sum <= l1 &&sum > 0) 38 ss = c1; 39 else if(sum <= l2&&sum > l1) 40 ss = c2; 41 else if(sum <= l3&& sum > l2) 42 ss = c3; 43 else if(sum <= l4&& sum > l3) 44 ss = c4; 45 else if(sum > l4) 46 ss = N; 47 if(p[i][j] > ss) 48 p[i][j] = ss; 49 } 50 } 51 for(k = 1; k <= n; ++k ) 52 for(i = 1; i <= n; ++i ) 53 for(j = 1; j <= n; ++j ) 54 { 55 if(p[i][j] > p[i][k] + p[k][j] && p[i][k] != N && p[k][j] != N) 56 p[i][j] = p[i][k] + p[k][j]; 57 } 58 printf("Case %d:\n",num); 59 for(i = 1; i <= m; ++i ) 60 { 61 scanf("%d%d",&sv,&ev); 62 if(p[sv][ev] == N) 63 printf("Station %d and station %d are not attainable.\n",sv,ev); 64 else 65 printf("The minimum cost between station %d and station %d is %I64d.\n",sv,ev,p[sv][ev]); 66 } 67 } 68 return 0; 69 }

浙公网安备 33010602011771号