USACO 2.4 CowTours
mark:题意不是很好懂的样子。先用floyd求最短路,再枚举两个块的每条边。。。细节要注意,另外要用double。。。2A,图论我果然很弱啊。
代码:
1 # include <stdio.h> 2 # include <string.h> 3 # include <math.h> 4 5 6 int n ; 7 int x[200], y[200] ; 8 double dp[200], g[200][200], INF = 1e9, ans ; 9 char gra[200][200] ; 10 11 12 double dist(double a, double b, double c, double d){return sqrt((a-c)*(a-c)+(b-d)*(b-d)) ;} 13 void floyd() 14 { 15 int i, j, k ; 16 for (k = 0 ; k < n ;k++) 17 for (i = 0 ; i < n ; i++) 18 for (j = 0 ; j < n ; j++) 19 if (g[i][j] > g[i][k]+g[k][j]) 20 g[i][j] = g[i][k]+g[k][j] ; 21 memset (dp, 0, sizeof(dp)) ; 22 ans = 0 ; 23 for (i = 0 ; i < n ; i++) 24 { 25 for (j = 0 ; j < n ; j++) if (i!=j && g[i][j] < INF && g[i][j] > dp[i]) 26 dp[i] = g[i][j] ; 27 if (dp[i] > ans) ans = dp[i] ; 28 } 29 } 30 31 32 int main () 33 { 34 int i, j ; 35 double buff, d ; 36 37 freopen ("cowtour.in", "r", stdin) ; 38 freopen ("cowtour.out", "w", stdout) ; 39 40 while (~scanf ("%d%*c", &n)) 41 { 42 for (i = 0 ; i < n ; i++) 43 scanf ("%d %d%*c", &x[i], &y[i]) ; 44 for (i = 0 ; i < n ; i++) 45 scanf ("%s", gra[i]) ; 46 for (i = 0 ; i < n ; i++) 47 for (j = 0 ; j < n ; j++) 48 if (gra[i][j] == '1') 49 g[i][j] = dist(x[i], y[i], x[j], y[j]) ; 50 else g[i][j] = INF ; 51 floyd() ; 52 buff = INF ; 53 for (i = 0 ; i < n; i++) 54 for (j = i+1 ; j < n ; j++) if (g[i][j] >= INF) 55 { 56 d = dp[i]+dp[j]+dist(x[i],y[i],x[j],y[j]) ; 57 if (d < buff) buff = d ; 58 } 59 if (buff > ans) ans = buff ; 60 printf ("%lf\n", ans) ; 61 } 62 return 0 ; 63 }