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 }