信息学奥赛一本通:【1343】牛的旅行

暴力Floyd就行了。。大水题。。

 1 #include<bits/stdc++.h>  
 2 using namespace std;
 3 
 4 //Floyd
 5 //水题 
 6 
 7 const int maxx = 200;
 8 const double Inf = 1e20;
 9 double n[maxx][maxx],a[maxx];    //a存的是以a为基准的最远点 
10 int d[maxx][2];
11 double tt = Inf;
12 
13 double dis( int i, int j)
14 {
15     return sqrt(pow(d[i][0]-d[j][0],2) + pow(d[i][1]-d[j][1],2));
16 }
17 
18 int main()
19 {    
20 //    FILE *f = fopen("data.txt","r");
21 //    ifstream inFile;
22 //    inFile.open("data2.txt");
23     int k,i,j,x,y,N,t,num,maxx=0;
24     string s;    //输入要处理 
25     scanf("%d",&N);
26 //    fscanf(f,"%d",&N);
27     for(i=1;i<=N;i++)
28     {
29         scanf("%d%d",&x,&y);
30 //        fscanf(f,"%d%d",&x,&y);
31         d[i][0] = x;
32         d[i][1] = y;
33     } 
34     for(i=1;i<=N;i++)
35     {
36         cin >> s;
37 //        inFile >> s;
38         for(j=0;j<s.size();j++)
39         {
40             t = s[j]-'0';
41             if(t)    n[i][j+1] = n[j+1][i] = dis(i,j+1);
42             else n[i][j+1] = n[j+1][i] = Inf;
43         }
44     }
45     
46     for(k=1;k<=N;k++)
47         for(i=1;i<=N;i++)
48             for(j=1;j<=N;j++)
49                 if(i!=j )    //这个条件必须 不然就无法确保对角线上为无限 ,确保一次,以后方便w 
50                     n[i][j] = min(n[i][j],n[i][k]+n[k][j]);
51                 
52     for(i=1;i<=N;i++)
53         for(j=1;j<=N;j++)
54             if(n[i][j]!=Inf && n[i][j]>a[i] )    a[i] = n[i][j];
55 
56     for(i=1;i<=N;i++)
57         for(j=1;j<=N;j++)
58             if(n[i][j]==Inf && i!=j ) //这个得要,不然对角线上元素又要算进去了。 (我感觉最简单的就是这个条件一直都加上比较好。 
59             {
60                 n[i][j] = dis(i,j);
61                 tt = min(tt,n[i][j] + a[i] + a[j]);        //这里求最小 
62             }
63              
64     //    我也没想到,就是联通不一定是最大的。。。。 
65     // 还是不够小心 
66     for(i=1;i<=N;i++)
67         if(a[i]>tt) tt = a[i];    //a[i] 已经被确保不等于Inf ,这里比出来最大的。 
68     printf("%.6f",tt);
69     return 0;
70 }
View Code

猜你喜欢

转载自www.cnblogs.com/AlwaysYu/p/8987733.html