先上一波题目  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. [fw]Linux下tty/pty/pts/ptmx详解

    基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...

  2. 攻防世界--Shuffle

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/a03353e605bc436798a7cabfb11be073 1.准备 获得信息 3 ...

  3. matlab调试技巧

    Matlab的调试总体分为,直接调试和间接调试. 1.直接调试: (1)去掉句末的分号: (2)单独调试一个函数:将第一行的函数声明注释掉,并定义输入量,以脚本方式执行 M 文件: (3)适当地方添加 ...

  4. C# DataTable、实体相互转换

    public static T GetEntity<T>(DataTable table) where T : new() { T entity = new T(); foreach (D ...

  5. 1.报表TIBCO Jaspersoft Studio工具教程入门--生成jrxml和jasper文件 然后拖拽到项目中 跟ireport一样

    转自:https://blog.csdn.net/KingSea168/article/details/42553781 2. 在接下来的教程中,我们将实现一个简单的JasperReports示例,展 ...

  6. 140-基于双TI DSP TMS320C6670+XC7K480T的6UCPCI Express高速数据处理平台

    基于双TI DSP TMS320C6670+XC7K480T的6UCPCI Express高速数据处理平台 一.板卡概述: 本技术开发主要是支持客户完成基于TI DSP TMS320C6678芯片和X ...

  7. vue,一路走来(7)--响应路由参数的变化

    今天描述的问题估计会有很多人也遇到过. vue-router多个路由地址绑定一个组件造成created不执行 也就是文档描述的,如下图 我的解决方案: created () { console.log ...

  8. Django中的APP

    3. Django中的APP: 什么是APP?以及为什么要用APP? project --> 项目 (老男孩教育大学校) APP --> 应用 (Linux学院/Python学院/大数据学 ...

  9. css: IE没法调整那些使用px作为单位的字体大小

    <style type="text/css"> h1{font-size:40px;} h3{font-size:30px;} p{font-size:14xp;} & ...

  10. ARC096E Everything on It 容斥原理

    题目传送门 https://atcoder.jp/contests/arc096/tasks/arc096_c 题解 考虑容斥,问题转化为求至少有 \(i\) 个数出现不高于 \(1\) 次. 那么我 ...