题意:给出很多个树,让你连接最少的边使整个图的直径最短。

思路:对每个树求出树的半径,然后将半径最大的树放在中间,然后将其他的树连接这个半径最大的树,求出ans即可。注意细节!

#include <iostream>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<map>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef long long ll;
const int N=100010;
int head[N];
int ip;
struct edgenode
{int to;int next;
} tu[N*2];
void init()
{ip=0;memset(head,-1,sizeof(head));
}
void add(int u,int v)
{tu[ip].to=v,tu[ip].next=head[u],head[u]=ip++;
}
bool vis[N]= {0};
int ans[105000];
int st,ed,len;
void dfs(int now,int pre,int sum)
{vis[now]=1;if(sum>len)len=sum,st=now;for(int k=head[now]; k!=-1; k=tu[k].next){int to=tu[k].to;if(to!=pre)dfs(to,now,sum+1);}
}
int main()
{int n,l;init();scanf("%d%d",&n,&l);for(int i=0; i<l; i++){int a,b;scanf("%d%d",&a,&b);add(a,b);add(b,a);}int bj=0;for(int i=0; i<n; i++)if(!vis[i]){len=0;st=i;dfs(i,-1,0);ed=st;len=0;dfs(st,-1,0);ans[bj++]=len;}sort(ans,ans+bj);if(bj>=3){int hh;hh=max(ans[bj-1],(ans[bj-1]+1)/2+(ans[bj-2]+1)/2+1);hh=max(hh,(ans[bj-2]+1)/2+(ans[bj-3]+1)/2+2);printf("%d\n",hh);}else if(bj==2){int hh=max(ans[1],(ans[0]+1)/2+(ans[1]+1)/2+1);printf("%d\n",hh);}elseprintf("%d\n",ans[0]);return 0;
}

NCPC2015 A Adjoin the Networks(求树的直径)相关推荐

  1. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 Claire and her little friend, ykwd, are travelli ...

  2. 树上子链(树形dp求树的直径)

    树上子链 题意: 给定一棵树 T ,树 T 上每个点都有一个权值. 定义一颗树的子链的大小为:这个子链上所有结点的权值和 . 请在树 T 中找出一条最大的子链并输出. 题解: 求树的直径,题目中存在负 ...

  3. HDU4612+Tarjan缩点+BFS求树的直径

    tarjan+缩点+树的直径 题意:给出n个点和m条边的图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 先tarjan缩点,再在这棵树上求直径.加的边即是连接这条直径的两端. 1 /* 2 ...

  4. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  5. Problem K. Road Network - ACPC2015(求树的直径 dp)

    Problem K. Road Network 题目链接 Arab Collegiate Programming Contest 2015 题意: 树形的公路,如果阻塞道路可以断开两个区域彼此的连接, ...

  6. 求树的直径的两种方法

    树的直径 树型dp求树的直径 优缺点: 优点为可以处理边权为负的情况,但不易得到直径的路径(指树的直径经过什么点). 代码模板: #include<bits/stdc++.h> using ...

  7. 《鲁滨逊漂流记》题解(LCA算法求树的直径)

    Description <鲁滨逊漂流记>只讲到了鲁滨逊在岛上建立起一个自给自足的生态环境.而大家不知道的是,在此之后,鲁滨逊因为太无聊,开始探索周边的岛屿,一共 NNN 天.鲁滨逊第 11 ...

  8. F - Warm up - hdu 4612(缩点+求树的直径)

    题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...

  9. 求树的直径(两种方法)

    ① 两次dfs 方法:先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径 证明如下: ①若P已经在直径上,根据树的直径的定义可知Q也在直径上且为直径的一个端 ...

  10. 求树的直径算法以及证明

    以下为两次dfs(bfs)的做法以及正确性证明. 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值: (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值: (3)再 ...

最新文章

  1. “神人”or“闲人”?你的未来由AI与大数据决定
  2. python【蓝桥杯vip练习题库】BASIC-11 十六进制转十进制
  3. 计算机桌面文件管理窗口,隐藏Win10此电脑窗口的6个额外文件夹
  4. 9Python全栈之路系列之Win字符编码深解
  5. 面向对象的多态性(2)
  6. mysql query plan_MySQL Execution Plan--IN查询计划(2)
  7. centos(linux) 下如何查看端口占用情况及杀死进程
  8. 如何用SQL实现从第几条记录开始取几条
  9. requests中获取请求到文本编码格式
  10. js进阶 11-8 jquery如何获取元素相对于父元素的位置
  11. 多态和C++多态的实现(汇总)
  12. Java库转oc,(java转行oc)什么是block,用java来解释oc中的block
  13. 一个很有意思的熊猫免疫器
  14. 世界各国国家代码简称
  15. Ubuntu总是默认进入客人会话问题解决
  16. Leetcode刷题之二叉搜索树、平衡二叉搜索树3
  17. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-01:BootLoader+Application的开发模式
  18. HashMap面试常问问题
  19. JSON学习笔记-处理空白字符(使用 SSE4.2 优化字符串扫描)
  20. 【原生代码】Python3 实现ATR、MA、EMA、SMMA、RMA、TEMA指标的计算

热门文章

  1. git中的origin
  2. (转)用4年多时间, 带领微软重登全球市值第一宝座, 纳德拉是如何做到的?
  3. Python经典面试题解析:实现斐波那契数列
  4. 唯心主义-柏拉图的哲学世界
  5. php判断caj文件页数,2M内的CAJ文档如何转PDF免费?不限页数手机在线操作分享
  6. 笔记本计算机在桌面显示器,笔记本连接显示器
  7. Knime 发送邮件
  8. LVS负载均衡群集(理论+实验)
  9. Matlab 车牌识别技术
  10. 2021年立秋是什么时候?立秋的习俗有哪些?