先上一波题目  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. 1571. [Usaco2009 Open]滑雪课Ski

    传送门 可以想到 $dp$,设 $f[i][j]$ 表示当前等级为 $i$,时间为 $j$ 的最大滑雪次数 显然上课不会上让自己等级降低的课,所以第一维 $i$ 满足无后效性 然后直接枚举 $i,j$ ...

  2. 上传.cgi在252板子上跑

    1.windows下写好.c程序 2.进入linux,准备交叉编译 arm-hisiv600-linux-gcc -g -Wall -o xxx.cgi xxx.c(交叉编译工具取决于板子) 3.把. ...

  3. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  4. 解决嵌套在ScrollView中的TableView滑动手势冲突问题

    最近在迭代开发公司项目的时候遇到了一个问题,在可以左右切换标签视图的ScrollView中嵌套了两个TableView用于展示视图,感觉一切so easy的情况下,问题出现了,因为左右两个视图既可以实 ...

  5. REVOKE - 删除访问权限

    SYNOPSIS REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRI ...

  6. overload和override的含义和区别

    重载(overload)和重写/覆盖(override)是Java多态性的不同表现形式. 重载(overload) (1) 重载是通过不同的方法参数来区分的,如不同的参数个数.顺序.类型. (2) 不 ...

  7. wireshark 抓包加密

    使用openssl 加密传输数据 #是否使用SLL连接,1是使用SSLCon=1 配置文件配置是否开启ssl

  8. elasticsearch相关聚合查询示例

    索引(index):logstash-nginx-*,type:nginx_access 请求路径: 1.按照某个字段进行分组统计访问量 { "query": { "bo ...

  9. 通过URL方式动态修改logback level级别

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ...

  10. loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp

    题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...