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 }

 

posted @ 2013-07-04 01:05  Seraph2012  阅读(248)  评论(0编辑  收藏  举报