洛谷 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就有多个 ...
随机推荐
- this的指向问题 call apply bind 中的this
在函数中this指向谁: 函数中的this指向谁,是由函数被调用的那一刻就确定下来的 平时确定一个函数中的this是谁,我们需要通过调用模式来确定 1. 函数调用模式 this ---> ...
- R语言控制流
一般来说R语言是自上而下执行的,但是遇到特殊情况可能用到循环执行某些语句,这时候条件运算和循环就能派上用场了.
- OtterCTF - Reverse - Msg Me This
原文地址:Msg Me This 题目 Category: Reverse Engineering Points: 500 Solves: 15 Description: Rick created a ...
- 一、Angular环境的搭建
1.安装nodejs (1) 下载网址https://nodejs.org/en/download/ (2) 双击进行安装 (3) 打开命令行,输入node -v 和 npm -v 查看是否安装成功 ...
- MySQL Authentication plugin 'caching_sha2_password' cannot be loaded
很多用户在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loade ...
- ivew url 的输入
1. <FormItem label="链接" prop="url"> <Input v-model="formValidate.u ...
- 牛客网NOIP赛前集训营-提高组(第七场)A-中国式家长 2
题目描述 有一天,牛牛找到了一个叫<中国式家长>的游戏,游戏中需要靠"挖脑洞"来提升悟性. 挖脑洞在一个\(N\)行\(M\)列的地图上进行,一开始牛牛有\(K\)点行 ...
- wxpython 文本框TextCtrl
path_text = wx.TextCtrl(frame, pos=(5, 5), size=(350, 24))最常用的两个函数:path = path_text.GetValue() conte ...
- Redis GeoHash
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11632810.html 背景 微信找附近的人,滴滴找附近的单车,饿了么找附近的餐馆 GeoHash算法 ...
- dubbo-go 的开发、设计与功能介绍
dubbo-go 的前世今生 dubbo-go 是目前 Dubbo 多语言生态最火热的项目.dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版.当时很 ...