先上一波题目  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——暴力枚举+最短路的更多相关文章

  1. 洛谷P1522 牛的旅行 Cow Tours

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

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

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

  3. 洛谷 P1522 牛的旅行 Cow Tours

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

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

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

  5. 洛谷P1522牛的旅行——floyd

    题目:https://www.luogu.org/problemnew/show/P1522 懒于仔细分情况而直接像题解那样写floyd然后不明白最后一步max的含义了... 分开考虑怎么保证在一个内 ...

  6. Luogu P1522 牛的旅行 Cow Tours

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

  7. P1522 牛的旅行 Cow Tours floyed

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

  8. P1522 牛的旅行 Cow Tours

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

  9. 洛谷P1522 牛的旅行

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

随机推荐

  1. JS的连等赋值

    参考自,我再整理一遍. 题目如下: var a = {n:1}; var b = a; a.x = a = {n:2}; alert(a.x); alert(b.x): 输出为  undefined, ...

  2. smbsh - 允许用UNIX命令访问NT文件系统

    总览 smbsh 描述 此程序是Samba套件的一部分. smbsh允许你用UNIX命令诸如ls,egrep和rcp等来访问NT文件系统.必须用动态链接的shell以便使smbsh工作正常. 从命令提 ...

  3. 关于Jenkins的网站及其他学习的网站

    配置efk https://www.cnblogs.com/fzxiaomange/p/efk-getstart.html https://blog.csdn.net/wangmuming/artic ...

  4. SVN中trunk,branches,tags的使用明细--项目代码的管理

    SVN在项目开发过程中有两种模式: 第一种:Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局svn://proj/|+ ...

  5. 后缀自动机(SAM) 学习笔记

    最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...

  6. css3系列--概述

    CSS3分成了不同类别,称为“modules”.而每一个“modules”都有于CSS2中额外增加的功能,以及向后兼容.CSS3早于1999年已经开始制订.[18]直到2011年6月7日,CSS 3 ...

  7. Ubuntu菜单栏的位置可以调 到左侧 或者底部

    hyx@hyx:/mnt/hgfs/Linux$ gsettings set com.canonical.Unity.Launcher launcher-position Bottom

  8. 记录每个action执行时间

    import org.apache.commons.lang.time.StopWatch; import org.aspectj.lang.JoinPoint; import org.aspectj ...

  9. python 模仿 C/C++ 结构体

    import struct from ctypes import * class MyStruct(Structure): _fields_ = [ ("v1", c_char), ...

  10. oracle-SQL语句执行原理和完整过程详解

    SQL语句执行过程详解 一条sql,plsql的执行到底是怎样执行的呢? 一.SQL语句执行原理 第一步:客户端吧语句发个服务端执行 当我们在客户端执行select语句时,客户端会把这条SQL语句发送 ...