HDU 4034 Graph(Floyd)

题目链接

以前练习赛中的一个题,当时没学图论,听学长说是弗洛伊德,最近学了,又重新看了一下,用的很不熟练啊。。。在WA了3 4次之后,没浮躁,很不容易。。。

题目:给你有向图的最短路,判断是否存在,存在,可以留下的最小边数。

思路:想的时间有点长,先弗洛伊德一遍,判断是图中是否存在最短路,若有则直接输出不存在,再判断图中是否存在是否有p[j][k] ==p[j][i] + p[i][k]的边,就是这里,重复计算了,WA4次,唉,开始的时候也考虑的重复计算的问题,天真的加了个break,还是不熟悉啊。。。终于发现问题后,加了个标记数组后,A了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N  100000
 4 int p[101][101],o[101][101];
 5 int main()
 6 {
 7     int t,i,j,k,num = 0,n,sum,z;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         memset(o,0,sizeof(o));
12         z = 0;
13         scanf("%d",&n);
14         sum = n*n - n;
15         num ++;
16         for(i = 1; i <= n; i ++)
17             for(j = 1; j <= n; j ++)
18            {
19                scanf("%d",&p[i][j]);
20            }
21         printf("Case %d: ",num);
22         for(i = 1; i <= n; i ++)
23             for(j = 1; j <= n; j ++)
24                 for(k = 1; k <= n; k ++)
25                 {
26                     if(p[j][k] > p[j][i]+p[i][k])
27                     {
28                         z = 1;
29                         break;
30                     }
31                 }
32         if(z)
33             printf("impossible\n");
34         else
35         {
36             for(i = 1; i <= n; i ++)
37                 for(j = 1; j <= n; j ++)
38                     for(k = 1; k <= n; k ++)
39                     {
40                         if(p[j][k] == p[j][i]+p[i][k]&&i != j&&i != k&&j != k&&o[j][k] == 0)
41                         {
42                             sum --;
43                             o[j][k] = 1;
44                         }
45                     }
46             printf("%d\n",sum);
47         }
48     }
49     return 0;
50 }
posted @ 2012-06-16 10:26  Naix_x  阅读(188)  评论(0编辑  收藏  举报