嘟嘟嘟

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

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. [Java反射基础四]通过反射了解集合泛型的本质

    本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...

  2. ApplicationHost.config文件被破坏导致IIS崩溃

    “”Application Host Helper Service 在尝试删除历史目录“C:\inetpub\history\CFGHISTORY_0000000475”时遇到错误.将跳过并忽略此目录 ...

  3. 响应式(2)——bootstrap的响应式

    <meta name="viewport" content="width=device-width,user-scalable=no"/> < ...

  4. sql: Compare Tables

    ---使用 UNION.INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式 select * from BookInfoList --存在不同的 selec ...

  5. 51Nod1957 有限背包计数问题

    传送门 另一个传送门 这题还挺有意思…… 先贴一波出题人的题解…… (啥你说你看不见?看来你还没过啊,等着A了再看或者乖乖花点头盾好了……) 然后是我的做法……思想都是一样的,只是细节不一样而已…… ...

  6. c#调用c++制作的基于mfc的ocx控件

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/51286926 原文中有问题部分已修改. c#调用c++制作的基于mfc的ocx控件     ...

  7. Python3.5 使用Sqlite3

    -------------------- 修雨轩陈@cnblog Python3.5 使用Sqlite3 python3.5 安装的时候会有很多可选参数,这些参数是默认不提供的,可是当我们想通过pip ...

  8. klee错误汇报二:KLEE的optimize选项的一个困惑

    问题已经提交github:https://github.com/klee/klee/issues/650 在一个对命令行参数进行建模的符号执行过程中,添加optimize选项与不添加optimize选 ...

  9. SQL Server ->> 数据一致性检查命令 -- DBCC CHECKDB

    Comming soon!!! 参考文献: CHECKDB From Every Angle: Complete description of all CHECKDB stages

  10. svn merge error must be ancestrally related to,trunk merge branch报错

    trunk merge branch的时候报错 xxx must be ancestrally related to xxx,这个报错的意思是两者不关联,所以需要去建立关联. [回顾背景]       ...