洛谷 P1522 牛的旅行 Cow Tours——暴力枚举+最短路
先上一波题目 https://www.luogu.org/problem/P1522
这道题其实就是给你几个相互独立的连通图
问找一条新的路把其中的两个连通图连接起来后使得新的图中距离最远的两个点之间的距离最小
当然这里不同点之间的距离都取最短的距离
那么我们可以预处理一波 每个独立的连通图里面最远的两个点的距离是多少
可以利用并查集维护哪些点是在同一个连通图中的
然后每一个点单独跑一遍最短路 然后就可以处理出每个独立的连通图的‘直径’了
然后再暴力枚举新的边(i,j) 新形成的图的直径就是两个单独图的直径的最大值
或者是经过新的边连接的另外两个最远点的距离 即离i最远的点的距离加上离j最远的点的距离加上边(i,j)的值
这样问题就顺利解决了 算法的复杂度应该就是n^3logn
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define inf 1e9+7
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,x[M],y[M],s[M][M];
int first[M],cnt;
struct node{int to,next; double w;}e[M*M];
void ins(int x,int y,double w){
e[++cnt]=(node){y,first[x],w};
first[x]=cnt;
//printf("%d %d %.2lf\n",x,y,w);
}
double gd(int a,int b){return sqrt(1.0*(x[a]-x[b])*(x[a]-x[b])+1.0*(y[a]-y[b])*(y[a]-y[b]));}
int fa[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
double dis[M][M],ans=inf,mxd[M];
struct qwq{
int id;
double d;
bool operator<(const qwq&x)const{return x.d<d;}
};
priority_queue<qwq>q;
void dj(int S){
dis[S][S]=;
q.push((qwq){S,dis[S][S]});
while(!q.empty()){
qwq x=q.top(); q.pop();
if(x.d>dis[S][x.id]) continue;
for(int i=first[x.id];i;i=e[i].next){
int now=e[i].to;
if(dis[S][now]>dis[S][x.id]+e[i].w){
dis[S][now]=dis[S][x.id]+e[i].w;
q.push((qwq){now,dis[S][now]});
}
}
}
mxd[S]=;
for(int i=;i<=n;i++) if(dis[S][i]!=inf) mxd[S]=max(mxd[S],dis[S][i]);
}
int col[M],sum;
double dd[M];
int main(){
n=read();
for(int i=;i<=n;i++) x[i]=read(),y[i]=read(),fa[i]=i;
for(int i=;i<=n;i++){
int c=getchar();
while(c!=''&&c!='') c=getchar();
for(int j=;j<=n;j++){
s[i][j]=(c-'');
dis[i][j]=(double)inf;
if(s[i][j]){
ins(i,j,gd(i,j));
int p=find(i),q=find(j);
if(p!=q) fa[p]=q;
}
c=getchar();
}
}
for(int i=;i<=n;i++) dj(i);
for(int i=;i<=n;i++){
int p=find(i);
if(!col[p]) col[p]=++sum;
col[i]=col[p];
dd[col[i]]=max(dd[col[i]],mxd[i]);
}
//for(int i=1;i<=n;i++) printf("%d ",col[i]); puts("qwq");
//printf("%.2lf %.2lf\n",dd[1],dd[2]);
//for(int i=1;i<=n;i++) printf("%.2lf ",mxd[i]); puts("qwq");
for(int i=;i<=n;i++){
int p=find(i);
for(int j=i+;j<=n;j++){
int q=find(j);
if(p!=q){
double d1=max(dd[col[p]],dd[col[q]]);
double d2=max(d1,mxd[i]+mxd[j]+gd(i,j));
ans=min(ans,d2);
}
}
}
printf("%.6lf\n",ans);
return ;
}
洛谷 P1522 牛的旅行 Cow Tours——暴力枚举+最短路的更多相关文章
- 洛谷P1522 牛的旅行 Cow Tours
---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...
- 洛谷 P1522 牛的旅行 Cow Tours 题解
P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...
- 洛谷 P1522 牛的旅行 Cow Tours
题目链接:https://www.luogu.org/problem/P1522 思路:编号,然后跑floyd,这是很清楚的.然后记录每个点在这个联通块中的最远距离. 然后分连通块,枚举两个点(不属于 ...
- 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd
https://www.luogu.org/problem/P1522 好坑啊,居然还有直径不通过新边的数据,还好不是很多. 注意一定要等Floyd跑完之后再去找连通块的直径,不然一定是INF. #i ...
- 洛谷P1522牛的旅行——floyd
题目:https://www.luogu.org/problemnew/show/P1522 懒于仔细分情况而直接像题解那样写floyd然后不明白最后一步max的含义了... 分开考虑怎么保证在一个内 ...
- Luogu P1522 牛的旅行 Cow Tours
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- P1522 牛的旅行 Cow Tours floyed
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- P1522 牛的旅行 Cow Tours
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- 洛谷P1522 牛的旅行
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
随机推荐
- 7、numpy——广播
1.广播的引出 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足 a. ...
- 基于Zookeeper实现客户端动态监听服务器上下线
一.在具体实现之前,先来了解一下Zookeeper的监听器的原理: 图中Main()线程作为客户端,当在主线程中创建Zookeeper客户端时,会默认创建两个子线程:Listener和connect, ...
- ApacheHttpServer出现启动报错:the requested operation has failed解决办法
转自:https://www.jb51.net/article/21004.htm 原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装 ...
- win10开机出现两个系统
1.cmd(Ctrl+R) 2.输入msconfig 3.选引导 4.删除多余的系统(切记不能删错)
- 什么是VPX技术?
北京太速科技有限公司 自主研发VPX板卡 http://www.orihard.com/ 欢迎关注 新型VPX(VITA 46)标准是自从VME引入后的25年来,对于VME总线架构的最重大也是最重要 ...
- linux shell 指令
一.文件比较运算符 1. e filename 如果 filename存在,则为真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename为目录,则为 ...
- ansible笔记(一)--架构图以及工作原理
一.ansible架构图 上图为ansible的基本架构,从上图可以了解到其由以下部分组成: 核心:ansible 核心模块(Core Modules):这些都是ansible自带的模块 扩展模块(C ...
- Synchronized和ReentranLock的比较
并发编程最容易遇到的问题就是就是安全问题,因此解决方式有两种 使用同步方法或同步代码块(Synchronized关键字) 使用锁机制(ReentranLock) 同步方法和同步代码块(Synchron ...
- WPF 几种常用控件样式的总结
这里把wpf中几种常用样式总结一下,后期可以直接拷贝使用,呵呵 一.Button <ResourceDictionary xmlns="http://schemas.microsoft ...
- javascript实现下拉菜单的显示与隐藏
demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...