题目大意

  每个牧场里的某些坐标位置有牧区,牧区间有一个个路径(长度为位置间的直线距离)。一个连通块内两个节点间的最短路径长度最大值为它的直径。请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。

思路

注意

  Floyd先枚举k。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cassert>
using namespace std; const int MAX_NODE = 200;
const double INF = 200000;
double Dist[MAX_NODE][MAX_NODE];
int TotNode, TotBlock; struct Coor//Coordinate
{
int X, Y; double Dist(const Coor& a)const
{
double x1 = X, y1 = Y, x2 = a.X, y2 = a.Y;
double dx = abs(x1 - x2), dy = abs(y1 - y2);
return sqrt(dx * dx + dy * dy);
}
}; struct Node
{
Coor Coordinate;
double MaxDist;
}_nodes[MAX_NODE]; void InitDist()
{
for (int i = 0; i < MAX_NODE; i++)
for (int j = 0; j < MAX_NODE; j++)
Dist[i][j] = INF;
for (int i = 0; i < MAX_NODE; i++)
Dist[i][i] = 0;
} void Read()
{
scanf("%d", &TotNode);
for (int i = 1; i <= TotNode; i++)
scanf("%d%d\n", &_nodes[i].Coordinate.X, &_nodes[i].Coordinate.Y);
char s[MAX_NODE];
for (int i = 1; i <= TotNode; i++)
{
scanf("%s", s + 1);
for (int j = 1; j <= TotNode; j++)
if (s[j] - '0')
Dist[i][j] = _nodes[i].Coordinate.Dist(_nodes[j].Coordinate);
}
} void Floyd()
{
for (int k = 1; k <= TotNode; k++)
for (int i = 1; i <= TotNode; i++)
for (int j = 1; j <= TotNode; j++)
Dist[i][j] = min(Dist[i][j], Dist[i][k] + Dist[k][j]);
} double MaxMaxDist;
void GetNodeMaxDist()
{
for (int i = 1; i <= TotNode; i++)
for (int j = 1; j <= TotNode; j++)
if (Dist[i][j] < INF)
{
_nodes[i].MaxDist = max(_nodes[i].MaxDist, Dist[i][j]);
MaxMaxDist = max(MaxMaxDist, _nodes[i].MaxDist);
}
} double GetAns()
{
double ans = INF;
for (int i = 1; i <= TotNode; i++)
for (int j = 1; j <= TotNode; j++)
if (Dist[i][j] == INF)
ans = min(ans, _nodes[i].MaxDist + _nodes[j].MaxDist + _nodes[i].Coordinate.Dist(_nodes[j].Coordinate));
return max(ans, MaxMaxDist);
} int main()
{
InitDist();
Read();
Floyd();
GetNodeMaxDist();
printf("%.6f\n", GetAns());
return 0;
}

  

最新文章

  1. 自定义BadgeView
  2. 【Android】Volley做网络请求的几种用法
  3. Graphql介绍(Introduction to GraphQL)
  4. Spring 事务配置管理,简单易懂,详细 [声明式]
  5. JavaScript要点 (三) 保留关键字
  6. mvc 4 Razor (@html.xx)语法大全以及应用
  7. 【转】终极 Shell
  8. JS 获取浏览器窗口大小clientWidth、offsetWidth、scrollWidth
  9. Jquery跨域读取城市天气预报信息
  10. eclipse工程的jdk从1.7升到1.8后报错解决办法
  11. vs查找功能不显示查找结果
  12. Linux 查找文件命令 find whereis locate
  13. 【中间件安全】IIS6安全加固规范
  14. python学习笔记01--基础
  15. Redis事件订阅和持久化存储
  16. input 文本框,对中文长度校验
  17. WebService快速上手
  18. pwa 概念
  19. bzoj 3309 反演
  20. C++报错集锦

热门文章

  1. 【转】Java 集合系列01之 总体框架
  2. js加减乘除在线计算器代码
  3. 笔记《精通css》第3章 盒模型,定位,浮动,清理
  4. Ubuntu16安装jdk8配置Tomcat9
  5. 关于类似vue-cli 脚手架
  6. android studio 控件提示大写
  7. RTL Compiler之synthesis steps
  8. Java_Web三大框架之Hibernate 入门(一)
  9. Git与SVN版本控制系统
  10. (转) Hibernate检索方式概述