题目大意:给定一个 N 个顶点的无向图,图中有若干联通块,现定义联通块的直径为该联通块中距离最远的两个点的距离,定义无向图的直径为这个图中所有联通块直径的最大值。现在在图上加一条边,使得两个本不连通的联通块得以联通,求加入一条边之后整张图直径的最大值最小是多少。

题解:首先在不加入边的情况下,图的直径为所有联通块直径的最大值。在加入某一条边时,可能对答案做贡献的情况即经过该边的一条穿过两个联通块的路径,显然,这个路径的值等于加入边的权值+该边的两个端点到各自联通块中距离的最大值。因此,需要预处理出每个点到各自联通块中点距离的最大值,这个问题又可以归约为多源最短路问题,即:Floyd。

通过这道题也学到了 floyd 的另一个性质,即:跑完 floyd 之后,若两点距离还是无穷,则证明这两个点不连通,利用这个性质即可完成联通块内的枚举。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=150+10;
  4. const double inf=1e15;
  5. double x[maxn],y[maxn],d[maxn][maxn],mxdis[maxn],len;
  6. int n;
  7. inline double calc(int i,int j){
  8. return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
  9. }
  10. void read_and_parse(){
  11. scanf("%d",&n);
  12. for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
  13. for(int i=1;i<=n;i++)
  14. for(int j=1;j<=n;j++){
  15. int dis;
  16. scanf("%1d",&dis);//表示读取缓冲区中一个字符,性能比字符串读取差
  17. if(dis)d[i][j]=calc(i,j);
  18. else if(i!=j)d[i][j]=inf;
  19. }
  20. }
  21. void floyd(){
  22. for(int k=1;k<=n;k++)
  23. for(int i=1;i<=n;i++)
  24. for(int j=1;j<=n;j++)
  25. d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  26. }
  27. void solve(){
  28. floyd();
  29. for(int i=1;i<=n;i++)
  30. for(int j=1;j<=n;j++){
  31. if(d[i][j]==inf)continue;
  32. mxdis[i]=max(mxdis[i],d[i][j]);
  33. len=max(mxdis[i],len);
  34. }
  35. double len2=inf;
  36. for(int i=1;i<=n;i++)
  37. for(int j=1;j<=n;j++)
  38. if(d[i][j]==inf)
  39. len2=min(len2,mxdis[i]+calc(i,j)+mxdis[j]);
  40. printf("%.6lf\n",max(len,len2));
  41. }
  42. int main(){
  43. read_and_parse();
  44. solve();
  45. return 0;
  46. }

【洛谷P1522】牛的旅行的更多相关文章

  1. 洛谷P1522 牛的旅行 Cow Tours

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

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

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

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

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

  4. 洛谷 P1522 牛的旅行 Cow Tours

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

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

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

  6. 洛谷 P1522 牛的旅行 Cow Tours——暴力枚举+最短路

    先上一波题目  https://www.luogu.org/problem/P1522 这道题其实就是给你几个相互独立的连通图 问找一条新的路把其中的两个连通图连接起来后使得新的图中距离最远的两个点之 ...

  7. 洛谷P1522 牛的旅行

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

  8. 洛谷 P1522 牛的旅行

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

  9. 洛谷P1522 [USACO2.4]牛的旅行 Cow Tours

    洛谷P1522 [USACO2.4]牛的旅行 Cow Tours 题意: 给出一些牧区的坐标,以及一个用邻接矩阵表示的牧区之间图.如果两个牧区之间有路存在那么这条路的长度就是两个牧区之间的欧几里得距离 ...

  10. P1522 牛的旅行

    P1522 牛的旅行 Cow Tours 提交 11.44k 通过 4.97k 时间限制 1.00s 内存限制 125.00MB 题目提供者洛谷 难度提高+/省选- 历史分数100 提交记录 查看题解 ...

随机推荐

  1. CF1096G Lucky Tickets

    https://www.luogu.org/problemnew/show/CF1096G 显然dp出用\(\frac{n}{2}\)个数能拼出来的每个数的方案数,平方相加就行了,dp显然ntt+快速 ...

  2. ECMAScript6——Set数据结构

    /** * 数据结构 Set */ // ----------------------------------------------------- /** * 集合的基本概念:集合是由一组无序且唯一 ...

  3. Java 中的 try catch 影响性能吗?

    前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...

  4. 起步 - vue-router路由与页面间导航

    vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理.可以说所有的后端开发都是这样做的,而前端路由是不存在"请 ...

  5. idea创建web项目教程

    官网下载idea,安装配置好后,双击进来,第一次创建项目时新建是这样的 第一步:   第二步:创建项目名和项目存放的路径 点finish进入这里   第三步: 第二步点OK进入这个页面,点上面那个加号 ...

  6. 浅谈SVG(可缩放的矢量图形)

    前一段项目中用到了svg图片就和其他的元素一样 直接引用就可以展示在页面上,因为项目紧张没有仔细的研究,最近在扩展自己的基础知识,偶然看到了这个东西,于是总结了一些博客园中关于这个svg的基础知识,只 ...

  7. Unity3d-通过简单示例来理解Time.deltaTime

    转载文章: Unity3d-通过简单示例来理解Time.deltaTime 2018年04月21日 18:04:14 Black_Window 阅读数:926 标签: UnityTime 更多 个人分 ...

  8. strongSwan配置、运行及测试

    版本信息:strongSwan v5.7.2 1.      编译 tar xvf strongswan-5.7.2.tar.gz ./configure --prefix=/usr/ --sysco ...

  9. PTA (Advanced Level) 1002 A+B for Polynomials

    1002 A+B for Polynomials This time, you are supposed to find A+B where A and B are two polynomials. ...

  10. VC++ 屏蔽掉警告

    使用VC6.0在开发程序的时候经常会遇到很多警告,很麻烦,也很耽误时间,可以使用如下方法屏蔽掉警告 在StdAfx.h 中 #define VC_EXTRALEAN 下面增加:#pragma warn ...