牛的旅行
【问题描述】
  农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧场不连通。现在,John想在农场里添加一条路径 ( 注意,恰好一条 )。对这条路径有这样的限制:一个牧场的直径就是牧场中最远的两个牧区的距离 ( 本题中所提到的所有距离指的都是最短的距离 )。考虑如下的两个牧场,图1是有5个牧区的牧场,牧区用*表示,路径用直线表示。每一个牧区都有自己的坐标:
 

   图1所示的牧场的直径大约是12.07106, 最远的两个牧区是A和E,它们之间的最短路径是A-B-E。   这两个牧场都在John的农场上。John将会在两个牧场中各选一个牧区,然后用一条路径连起来,使得连通后这个新的更大的牧场有最小的直径。注意,如果两条路径中途相交,我们不认为它们是连通的。只有两条路径在同一个牧区相交,我们才认为它们是连通的。   现在请你编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。

【输入格式】
   第 1 行:一个整数N (1 <= N <= 150), 表示牧区数;    第 2 到 N+1 行:每行两个整数X,Y ( 0 <= X,Y<= 100000 ), 表示N个牧区的坐标。每个牧区的坐标都是不一样的。    第 N+2 行到第 2*N+1 行:每行包括N个数字 ( 0或1 ) 表示一个对称邻接矩阵。    例如,题目描述中的两个牧场的矩阵描述如下:
  A B C D E F G H      
A 0 1 0 0 0 0 0 0      
B 1 0 1 1 1 0 0 0      
C 0 1 0 0 1 0 0 0      
D 0 1 0 0 1 0 0 0      
E 0 1 1 1 0 0 0 0      
F 0 0 0 0 0 0 1 0      
G 0 0 0 0 0 1 0 1      
H 0 0 0 0 0 0 1 0   
输入数据中至少包括两个不连通的牧区。

【输出格式】
   只有一行,包括一个实数,表示所求答案。数字保留六位小数。
 
 
【输入样例】
   8
   10 10
   15 10
   20 10
   15 15
   20 15
   30 15
   25 10
   30 10
   01000000
   10111000
   01001000
   01001000
   01110000
   00000010
   00000101
   00000010
【输出样例】
   22.071068
 带注释版:
 #include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio> using namespace std;
const double Maxi=1e12;
double f[][],m[],minx,temp;
double x[],y[]; //统计牧区坐标 double dist(int i,int j) { //求两点的距离
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); //公式为根号下x1-x2^2+y1-y2^2;
}
int main() {
int i,j,n,k; //n为牧区数
char c;//代表坐标之间是否连通
cin>>n;
for(i=; i<=n; i++)cin>>x[i]>>y[i]; //输入每个点的坐标
for(i=; i<=n; i++)
for(j=; j<=n; j++) {
cin>>c;
if(c=='')f[i][j]=dist(i,j);//两点有边则需计算两点间的距离
else f[i][j]=Maxi;//无边赋最大值,便于进行区分
}
for(k=; k<=n; k++) //求连通的两点间最短距离
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(i!=j&&i!=k&&j!=k) //因为如果是自己与自己进行比较的话,距离一定最小,所以需要进行排除
if(f[i][k]<Maxi&&f[k][j]<Maxi)//如果他们是联通的
if(f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];//进行更新
memset(m,,sizeof(m));
for(i=; i<=n; i++) //求i点到其他可达点的最大距离
for(j=; j<=n; j++)
if(f[i][j]<Maxi&&m[i]<f[i][j]) m[i]=f[i][j];//进行记录每两个点之间的距离
minx=1e20;
for(i=; i<=n; i++) //求不连通点连通后的最小距离
for(j=; j<=n; j++)
if(i!=j&&f[i][j]==Maxi) {
//f[i][j]>Maxi-1这一步特别重要!因为求的是不连通的点,所以必须加一个判断
temp=dist(i,j);//假设他们已经连通
if(minx>m[i]+m[j]+temp) minx=m[i]+m[j]+temp;
}
for(i=; i<=n; i++) if(m[i]>minx)minx=m[i];
printf("%.6lf",minx);
return ;
}

不带注释版:

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath> using namespace std;
const int Maxn=;
const double mm=1e12; int n;
double zbx[Maxn],zby[Maxn];
double gx[Maxn][Maxn];
double mi[Maxn],minn=1e20,jiashe; double juli(int i,int j) {
return sqrt((zbx[i]-zbx[j])*(zbx[i]-zbx[j])+(zby[i]-zby[j])*(zby[i]-zby[j]));
} int main() {
cin>>n;
char g;
for(int i=; i<=n; i++) {
cin>>zbx[i]>>zby[i];
}
for(int i=; i<=n; i++) {
for(int j=; j<=n; j++) {
cin>>g;
if(g=='') {
gx[i][j]=juli(i,j);
} else gx[i][j]=mm;
}
}
for(int k=; k<=n; k++)
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
if(i!=j&&j!=k&&i!=k)
if(gx[i][k]<mm&&gx[k][j]<mm)
if(gx[i][j]>gx[i][k]+gx[k][j])
gx[i][j]=gx[i][k]+gx[k][j];
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
if(gx[i][j]<mm&&mi[i]<gx[i][j]) mi[i]=gx[i][j];
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
if(i!=j&&gx[i][j]==mm) {
jiashe=juli(i,j);
if(minn>mi[i]+mi[j]+jiashe) minn=mi[i]+mi[j]+jiashe;
}
for(int i=;i<=n;i++) if(mi[i]>minn)minn=mi[i];
printf("%.6lf",minn);
return ;
}

不带

codevs 1405 牛的旅行x的更多相关文章

  1. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

  2. 洛谷 P1522 牛的旅行 Cow Tours 题解

    P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...

  3. P1522 牛的旅行

    P1522 牛的旅行 Cow Tours 提交 11.44k 通过 4.97k 时间限制 1.00s 内存限制 125.00MB 题目提供者洛谷 难度提高+/省选- 历史分数100 提交记录 查看题解 ...

  4. 洛谷P1522 [USACO2.4]牛的旅行 Cow Tours

    洛谷P1522 [USACO2.4]牛的旅行 Cow Tours 题意: 给出一些牧区的坐标,以及一个用邻接矩阵表示的牧区之间图.如果两个牧区之间有路存在那么这条路的长度就是两个牧区之间的欧几里得距离 ...

  5. [图论]牛的旅行 Cow Tours :Floyed-Warshall

    牛的旅行 Cow Tours 目录 牛的旅行 Cow Tours 题目描述 输入格式 输出格式 输入输出样例 输入 #1 输出 #1 解析 代码 题目描述 农民 John的农场里有很多牧区.有的路径连 ...

  6. CODEVS——T 1036 商务旅行

    http://codevs.cn/problem/1036/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  7. codevs——1267 老鼠的旅行(棋盘DP)

    1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description ...

  8. codevs 1450 xth 的旅行

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 毕业了,Xth很高兴,因为他要和他的 ra ...

  9. codevs——T1267 老鼠的旅行

    http://codevs.cn/problem/1267/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

随机推荐

  1. myeclipse中jpa的安装以及jpa reverse engining

    myeclipse中jpa的安装以及jpa reverse engining 安装 右击 Configure Facets, Install JPA jpa reverse engining 1.db ...

  2. k8s 1.9安装

    关闭所有节点的selinux.iptables.firewalld systemctl stop iptables systemctl stop firewalld systemctl disable ...

  3. Codeforces 1221C. Perfect Team

    传送门 考虑如何保证限制,首先团队数最大就是 $min(c,m)$ 但是还不够,每个团队还要 $3$ 个人,所以还要和 $(c+m+x)/3$ 再取 $min$ 这样就满足所有限制了 #include ...

  4. js制作秒表

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. 103、Swarm如何管理存储数据?(Swarm10)

    参考https://www.cnblogs.com/CloudMan6/p/8000906.html   Service 的容器副本会 scale up/down ,会 failover,会在不同的主 ...

  6. java实现spark常用算子之flatmap

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  7. JavaScript斑马线表格制作

    //实现斑马线表格 //方法1: document.write('<table border="1">'); for(var i=1; i<11; i++){ i ...

  8. Spring Boot 实际操作

    1.什么是springboot 2.springboot的很多默认编码方式都是utf-8,真是福利啊. 3.spring boot如何启动和访问和MocMvc测试 4.开发环境的调试热启动 5.app ...

  9. oracle数据库连接问题org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implemented by JDBC driver - upgrade your driver...

    org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implement ...

  10. 配置Linux静态IP地址