洛谷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 ...
随机推荐
- SDUST数据结构 - 19级期末考试
判断题: 选择题: 函数题: 6-1 统计二叉树叶子结点个数: 题目: 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typ ...
- 这难道不是.NET5 的bug? 在线求锤?
hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法. 也希望同学们能帮我理解. 一个朴素的需求 这是一个api项目,默认所有的api都需要授权, ...
- 数据分析 Pandas 简介和它的的数据结构
本文主要讲Pandas 的Series和DataFrame 的相关属性和操作 1.Series的相关属性和操作# --Series是一种类似于一维数组的对象,只能存放一维数组!由以下两部分组成:# v ...
- 编年史:OI算法总结
目录(按字典序) A --A* D --DFS找环 J --基环树 S --数位动规 --树形动规 T --Tarjan(e-DCC) --Tarjan(LCA) --Tarjan(SCC) --Ta ...
- 【原创】Linux虚拟化KVM-Qemu分析(八)之virtio初探
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据
我们都知道参数化. 比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息. 在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的 ...
- jquery 数据查询
jquery 数据查询 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- 我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法
我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法 一.介绍 最近,我在写有关使用 Jenkins 搭建企业级持续集成环境的文章,准备了四台服务器,企业级别嘛,一台就 ...
- (ETL)ETL架构师面试题(转载)
1. What is a logical data mapping and what does it mean to the ETL team?什么是逻辑数据映射?它对ETL项目组的作用是什么? 答: ...
- GC 卡顿 优化 三色标记优势
小结: 1. 三色标记的一个明显好处是能够让用户程序和 mark 并发的进行 Go GC 卡顿由秒级降到毫秒级以下:到底做了哪些优化? https://mp.weixin.qq.com/s/2BMGG ...