其他分享
首页 > 其他分享> > 牛的旅行

牛的旅行

作者:互联网

难度

普及+/题高

题目

输入一个N、N个坐标和一个N行N列由0和1组成的矩阵A(数字之间没有空格),表示有 N(1≤N≤150)个牧区分别在(Xi,Yi)的地方(1≤Xi,Yi≤ 105),其中Ai,j若是1,则表示第i个牧场和第j个牧场之间有一条路,否则表示没有路,一组连通的牧区称为一个牧场,一组数据中会有至少2个牧场,求把其中2个牧场用一条路连起来后这一个大牧场中两个距离最远的两个牧区的最短距离是多少。(结果保留6位小数)

思路

  1. 将A初始化
  2. 输入数据
  3. 计算每条路的长度
  4. 统计牧场数并将每个牧场的每个牧区存在动态数组G中
  5. 求A的最短路
  6. 统计每个牧场中相距最远的两个牧区的最远距离和每个牧场中每个牧区距离该牧场中离它最远的牧区的距离
  7. 分别计算每两个不同牧场之间连一条路后大牧场相距最远的两个牧区的最短距离后找到最短距离最短的一个
  8. 输出答案

代码

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 int n,x[155],y[155],home[155];
  4 double a[155][155];
  5 vector<int> g[155];
  6 bool vis[155];
  7 void dfs(int s,int tmp)
  8 {
  9     for(int i=1;i<=n;i++)
 10     {
 11         if(a[s][i]!=100005&&vis[i]==0)
 12         {
 13             g[tmp].push_back(i);
 14             home[i]=tmp;
 15             vis[i]=1;
 16             dfs(i,tmp);
 17         }
 18     }
 19 }
 20 double length(int i,int j)
 21 {
 22     int temp_x=abs(x[i]-x[j]);
 23     int temp_y=abs(y[i]-y[j]);
 24     return sqrt(temp_x*temp_x+temp_y*temp_y);
 25 }
 26 int main()
 27 {
 28     cin>>n;
 29     for(int i=1;i<=n;i++)
 30     {
 31         for(int j=1;j<=n;j++)
 32         {
 33             if(i!=j) 
 34             {
 35                 a[i][j]=100005;
 36             }
 37         }
 38     }
 39     for(int i=1;i<=n;i++)
 40     {
 41         scanf("%d%d",&x[i],&y[i]);
 42     }
 43     for(int i=1;i<=n;i++)
 44     {
 45         string s;
 46         cin>>s;
 47         for(int j=1;j<=n;j++)
 48         {
 49             if(s[j-1]!='0')
 50             {
 51                 a[i][j]=length(i,j);
 52             }
 53         }
 54     }
 55     int num=0;
 56     for(int i=1;i<=n;i++)
 57     {
 58         if(vis[i]==0)
 59         {
 60             dfs(i,num);
 61             num++;
 62         }
 63     }
 64     for(int k=1;k<=n;k++)
 65     {
 66         for(int i=1;i<=n;i++)
 67         {
 68             for(int j=1;j<=n;j++)
 69             {
 70                 if(a[i][j]>a[i][k]+a[k][j])
 71                 {
 72                     a[i][j]=a[i][k]+a[k][j];
 73                 }
 74             }
 75         }
 76     }
 77     double tmp[155],max_dis[155];
 78     memset(tmp,0,sizeof(tmp));
 79     memset(max_dis,0,sizeof(max_dis));
 80     for(int i=0;i<num;i++)
 81     {
 82         for(int j=0;j<g[i].size();j++)
 83         {
 84             for(int k=0;k<g[i].size();k++)
 85             {
 86                 if(a[g[i][j]][g[i][k]]>tmp[i+1])
 87                 {
 88                     tmp[i+1]=a[g[i][j]][g[i][k]];
 89                 }
 90                 if(a[g[i][j]][g[i][k]]>max_dis[g[i][j]])
 91                 {
 92                     max_dis[g[i][j]]=a[g[i][j]][g[i][k]];
 93                 }
 94             }
 95         }
 96     }
 97     double ans=1e10;
 98     for(int i=1;i<=n;i++)
 99     {
100         for(int j=1;j<=n;j++)
101         {
102             if(home[i]!=home[j])
103             {
104                 double zhi_jing=max(max_dis[i]+max_dis[j]+length(i,j),max(tmp[home[i]],tmp[home[j]]));
105                 if(zhi_jing<ans)
106                 {
107                     ans=zhi_jing;
108                 }
109             }
110         }
111     }
112     printf("%.6f",ans);
113     return 0;
114 }

标签:tmp,旅行,155,int,牧场,牧区,dis
来源: https://www.cnblogs.com/qiuqiuliu/p/16501009.html