洛谷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的更多相关文章

  1. P1522 [USACO2.4]牛的旅行 Cow Tours(Floyd)

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

  2. 洛谷P1522 牛的旅行 Cow Tours

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

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

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

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

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

  5. 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  6. LCA【洛谷P2971】 [USACO10HOL]牛的政治Cow Politics

    P2971 [USACO10HOL]牛的政治Cow Politics 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向 ...

  7. 洛谷P2870 - [USACO07DEC]最佳牛线Best Cow Line

    Portal Description 给出一个字符串\(s(|s|\leq3\times10^4)\),每次从\(s\)的开头或结尾取出一个字符接在新字符串\(s'\)的末尾.求字典序最小的\(s'\ ...

  8. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  9. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...

随机推荐

  1. 【栈和队列】5、队列概述与数组队列的基本实现 - Java

    3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...

  2. 【ORA】ORA-4031错误分析和解决办法

    1. ORA-4031错误的原因,一般是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来 ...

  3. 【ORACLE错误】SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled

    执行set autotrace traceonly的时候,报错 SQL> set autotrace traceonly SP2-0618: Cannot find the Session Id ...

  4. 【ORA】ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O

    操作系统是CentOS 5.11 数据库 10.2.0.5.0 晚上查看数据库,发现数据库报错查看相关的trace文件内容如下: *** SERVICE NAME:(SYS$BACKGROUND) 2 ...

  5. Ubuntu20.04安装Typora

    Ubuntu20.04安装Typora 安装方法 # optional, but recommended sudo apt-key adv --keyserver keyserver.ubuntu.c ...

  6. STM32驱动LCD实战

    前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...

  7. SDS——动态字符串

    Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c. SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并 ...

  8. Jenkins部署web项目到Tomcat(shell脚本)

    一.首先配置Publish Over SSH插件 配置地址:系统管理-->系统设置-->Publish over SSH(需要安装Publish over SSH插件) 二.jenkins ...

  9. Spark 应用监控告警-Graphite_exporter

    Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面 事后查看 REST API 度量 高级工具 一.下载graphite_exporter 1.1 修改gr ...

  10. MySQL数据库操作生成UUID

    问题描述: 通过数据库操作,生成无横线的uuid,同时插入至数据库之中. 因为我要给项目做一些测试数据,项目的主键为32位无'-'的uuid,然后在数据库中,通过数据库操作,然后插入一些测试数据. 生 ...