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 }

你可能感兴趣的:(floyd)