洛谷P1522 [USACO2.4]牛的旅行 Cow Tours
洛谷P1522 [USACO2.4]牛的旅行 Cow Tours
题意:
给出一些牧区的坐标,以及一个用邻接矩阵表示的牧区之间图。如果两个牧区之间有路存在那么这条路的长度就是两个牧区之间的欧几里得距离。
对于一个联通块,称之为一个牧场,也就是说一个牧场内任意一个牧区都可以到达该牧场内的任意的另外一个牧区。
对于一个牧场,它的直径是这个联通块内最短路的最大值。
现在让你在恰当地选择两个牧场,在这两个牧场中各自选一个牧区,在这两个牧区之间建路,要求建路之后所有牧场中最大的直径最小。这里其实如果产生了新的最大直径(也可能不产生新的最大直径),那么一定是在这个新的农场中产生的,所以这里不如说恰当选择两个牧场从中选择两个牧区建边,使得产生的新的牧场的直径最小。
输出建边之后所有农场中最大的直径。
题解:
很好的一道最短路题。
先按照题目要求建立邻接矩阵,之后再这个邻接矩阵中跑一次\(floyd\)。
用一个数组\(MaxDis\)维护对于每个牧区,它所在的牧场中离它最远的牧区的距离是多少。
这样枚举每个不存在边的牧场对,当假设他们连接之后,构成的新牧场的可能的直径\(d_{uv}=MaxDis[u]+MaxDis[v]+getDis(u,v)\),这里之所以说可能是因为可能原来\(u\)或\(v\)所在的农场直径比这个\(d_{uv}\)要大。
这里不需要考虑太细节,只需要用一个变量记录在不添加边的时候,所有牧场中直径的最大值,然后找到添加边之后最小的\(d\),在这两个值之间取较大的既是答案。原因很简单,我们担心的是\(d\)可能比原来的\(u\)或\(v\)所在牧场的直径小,所以新牧场的直径实际上是\(max\{d_{cur},d_u,d_v\}\),之后答案取\(min\{max\{d_{u_1v_1},d_{u_1},d_{v_1}\},d_{u_2v_2},d_{u_2},d_{v_2}\},...,d_{u_xv_x},d_{u_x},d_{v_x}\}\}\),这个等价于\(max\{d_{f_1},d_{f_2},...,d_{f_n},min\{d_{u_1v_1},d_{u_2v_2},...,d_{u_xv_x}\}\}=max\{max\{d_{f_i}\},min\{d_{u_jv_j}\}\}\),其中\(d_{f_i}\)表示第\(i\)个牧场的直径。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
const int Maxn = 200;
const double INF = 1e7;
double dis[Maxn][Maxn], pos[Maxn][2], MaxDis[Maxn];
double getDis(int x, int y) {
return sqrt(pow(pos[x][0] - pos[y][0], 2) + pow(pos[x][1] - pos[y][1], 2));
}
void solve() {
int n, t;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lf %lf", &pos[i][0], &pos[i][1]);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%1d", &t);
if (t == 1) {
dis[i][j] = dis[j][i] = getDis(i, j);
} else if (i != j) {
dis[i][j] = dis[j][i] = INF;
}
}
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dis[i][j] = std::min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
double max1 = 0, max2 = INF;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (dis[i][j] != INF) {
MaxDis[i] = std::max(MaxDis[i], dis[i][j]);
max1 = std::max(max1, dis[i][j]);
}
}
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (dis[i][j] == INF) {
max2 = std::min(max2, MaxDis[i] + MaxDis[j] + getDis(i, j));
}
}
}
printf("%.6f\n", std::max(max1, max2));
}
int main() {
solve();
return 0;
}
洛谷P1522 [USACO2.4]牛的旅行 Cow Tours的更多相关文章
- P1522 [USACO2.4]牛的旅行 Cow Tours(Floyd)
题目描述 Farmer John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer Joh ...
- 洛谷P1522 牛的旅行 Cow Tours
---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...
- 洛谷 P1522 牛的旅行 Cow Tours 题解
P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...
- [图论]牛的旅行 Cow Tours :Floyed-Warshall
牛的旅行 Cow Tours 目录 牛的旅行 Cow Tours 题目描述 输入格式 输出格式 输入输出样例 输入 #1 输出 #1 解析 代码 题目描述 农民 John的农场里有很多牧区.有的路径连 ...
- 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party
P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...
- LCA【洛谷P2971】 [USACO10HOL]牛的政治Cow Politics
P2971 [USACO10HOL]牛的政治Cow Politics 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向 ...
- 洛谷P2870 - [USACO07DEC]最佳牛线Best Cow Line
Portal Description 给出一个字符串\(s(|s|\leq3\times10^4)\),每次从\(s\)的开头或结尾取出一个字符接在新字符串\(s'\)的末尾.求字典序最小的\(s'\ ...
- 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解
P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...
- 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...
随机推荐
- 【Oracle】 并行查询
所谓并行执行,是指能够将一个大型串行任务(任何DML,一般的DDL)物理的划分为叫多个小的部分,这些较小的部分可以同时得到处理.何时使用并行执行:1.必须有一个非常大的任务 2.必须有充足的资源(CP ...
- ctfhub技能树—sql注入—UA注入
手注 打开靶机 查看页面信息 抓取数据包 根据提示注入点在User-Agent文件头中 开始尝试注入 成功查到数据库名 查询数据表名 查询字段名 查询字段信息 成功拿到flag 盲注 测试是否存在时间 ...
- ctfhub技能树—sql注入—Cookie注入
手注 打开靶机 查看页面信息 查找cookie 测试是否为cookie注入 抓包 尝试注入 成功查询到数据库名 查询表名 查询字段名 查询字段信息 成功拿到flag sqlmap 查询数据库名 pyt ...
- let关键字:加强版的var关键字
本文首发于个人网站:let关键字:加强版的var关键字 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- let.再说 let 的具体用法之前,大叔想先和你说说大叔自己对 let 的感受 -- ...
- Py数据类型—整形与字符串
数据类型 在指针的右边输入.可以触发功能列表: 数字(整形):也就是123之类的,不能是abcd和中文之类的,数据类型为int 1.强制字符转换 a="123" b=int(a) ...
- click的简单使用
click的简单使用 先通过一个简单的例子来认知一下click把 import click @click.command() @click.option('-p', '--port', default ...
- 转 3 jmeter的两种录制方法
录制1-badboy(推荐) badboy是一款自动化测试工具,它可以完成简单的功能测试和性能测试.其实它是一款独立的测试工具,只不过它录制东西导出的格式适用于jmeter,所以我们经常把jmet ...
- C#高级编程第11版 - 第七章 索引
[1]7.1 相同类型的多个对象 1.假如你需要处理同一类型的多个对象,你可以使用集合或者数组. 2.如果你想使用不同类型的不同对象,你最好将它们组合成class.struct或者元组. [2]7.2 ...
- hook笔记②
- git的使用学习笔记--项目版本操作
一.使用场景 版本回退:上线失败--需要回退到上个版本 二.操作 先编辑 vim text.txt git status git add . 这个命令能看到所有的增加操作 git com ...