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 }
posted @ 2012-06-30 19:58  Naix_x  阅读(150)  评论(0)    收藏  举报