嘟嘟嘟

题面挺绕的,“翻译”一下:

1.牧区是一个点,牧场是所有直接相连的点构成的联通块。

2.两个牧区之间的距离是这两个距离之间的最短路,只有直接相连的两个牧区之间的距离是欧几里得距离。

3.牧场的直径:这个牧场中两个相隔最远的两个牧区之间的距离。

4.求添加一条边合并两个牧场之后,使这个新的牧场的直径最小。

做法一步步想,就能想出来:

1.算出所有相邻牧区之间的距离,即边权。

2.用floyd求出所有牧区之间的最短路。

3.dfs联通块染色。

4.求出每一个牧场的直径。那么除了有一个M_blo[i]:代表牧场 i 的直径,还需要Max[i]:代表在一个联通块内,离牧区 i 最远的点的距离。然后用Max[i]更新M_blo[vis[i]]就行了。O(n2)枚举。

5.枚举点对(i, j),如果不在一个联通块内,就连边合并所在的两个牧场vis[i], vis[j],并用新的直径更新答案。新的直径可能是这三者中的最大值:1.vis[i]的直径。2.vis[j]的直径。3.Max[i] + dis[i][j] +Max[j]。还是O(n2)的。

所以最终复杂度是floyd复杂度,O(n3)。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const db INF = 1e10;
const db eps = 1e-;
const int maxn = ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << ) + (ans << ) + ch - '', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int n;
struct Node
{
int x, y;
}t[maxn];
db dis[maxn][maxn];
db Max[maxn], M_blo[maxn]; db calc(Node a, Node b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
} int vis[maxn], col = ;
void dfs(int now)
{
vis[now] = col;
for(int i = ; i <= n; ++i)
if(!vis[i] && dis[now][i] < INF) dfs(i);
} int main()
{
n = read();
for(int i = ; i <= n; ++i) t[i].x = read(), t[i].y = read();
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
{
int x; scanf("%1d", &x);
if(x || i == j) dis[i][j] = calc(t[i], t[j]);
else dis[i][j] = INF;
}
}
for(int i = ; i <= n; ++i) if(!vis[i]) ++col, dfs(i);
for(int k = ; k <= n; ++k)
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
if(dis[i][j] < INF) Max[i] = max(Max[i], dis[i][j]);
M_blo[vis[i]] = max(M_blo[vis[i]], Max[i]);
}
db Mina = INF, Maxa = ;
for(int i = ; i <= n; ++i)
for(int j = i + ; j <= n; ++j) if(vis[i] != vis[j])
{
Maxa = max(max(M_blo[vis[i]], M_blo[vis[j]]), Max[i] + calc(t[i], t[j]) + Max[j]);
Mina = min(Mina, Maxa);
}
printf("%.6lf\n", Mina);
return ;
}

luogu P1522 Cow Tours的更多相关文章

  1. 洛谷P1522 牛的旅行 Cow Tours

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

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

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

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

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

  4. USACO 2.4 Cow Tours

    Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with cer ...

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

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

  6. Luogu P1522 牛的旅行 Cow Tours

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

  7. 洛谷 P1522 牛的旅行 Cow Tours

    题目链接:https://www.luogu.org/problem/P1522 思路:编号,然后跑floyd,这是很清楚的.然后记录每个点在这个联通块中的最远距离. 然后分连通块,枚举两个点(不属于 ...

  8. 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd

    https://www.luogu.org/problem/P1522 好坑啊,居然还有直径不通过新边的数据,还好不是很多. 注意一定要等Floyd跑完之后再去找连通块的直径,不然一定是INF. #i ...

  9. 洛谷 P1522 牛的旅行 Cow Tours——暴力枚举+最短路

    先上一波题目  https://www.luogu.org/problem/P1522 这道题其实就是给你几个相互独立的连通图 问找一条新的路把其中的两个连通图连接起来后使得新的图中距离最远的两个点之 ...

随机推荐

  1. 封装常用的跨浏览器的事件对象EventUtil

    var EventUtil = { addHandler: function(element,type,handler) { //事件监听 if(element.addEventListener) { ...

  2. Ms SQL Server 游标嵌套 初始化数据

    --TRUNCATE TABLE TAB_ROLE_FUNC; --SELECT * FROM TAB_ROLE_FUNC; ), ; --外层游标 DECLARE CURSOR_ROLE CURSO ...

  3. Angular4 step by step.4

    1.官方的模拟远程调用API接口没整出来,干脆自己使用 最新版本 .netcore2.1.0 preview 作为请求地址 2.直接上图懒得沾代码了,等完善后再开放所有源码: 3.使用了Chole.O ...

  4. MDI-设置子窗体只能弹出一个--单例模式

    不足之处,欢迎指正! 什么是MDI..我表示不知道的呢. MDI(Multiple Document Interface)就是所谓的多文档界面,与此对应就有单文档界面 (SDI), 它是微软公司从Wi ...

  5. js中map和python中的map

    js 中的map: 由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow( ...

  6. 修改phpmyadmin不能导入大文件的限制

    情景:我需要导入一张1.03GB的数据表,但是phpmyadmin导入文件默认为不能超过2M.因此需要修改phpmyadmin导入文件的大小限制. 1.phpmyadmin的导入也就是php完成文件上 ...

  7. BFC(Box Formatting Context)的原理

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  8. asp.net core 错误定位 & vs2017 远程调试部署在centos上的asp.net core程序

        前言 程序运行中会出现各种BUG. 排除BUG有三种方式. 一.访问页面直接报错误信息 出于安全,服务器是关闭这个功能的.在centos上可以用 命令设置环境变量来解决:   export A ...

  9. easy html+css tree 简单的HTML+css导航树

    code: show:

  10. Python基础-map/reduce/filter

    一.map Python内置函数,用法及说明如下: class map(object): """ map(func, *iterables) --> map obj ...