题意:

n个点,m条边,m <= n <= 100000,边的长度都为1。

点从 0 ~ n-1 编号。开始时图是不连通的,并且没有环。

通过加入一些边后,可以使图连通。要求加入的边不能多余(即生成的图是一棵树)。

问连通后的图,任意两点之间的距离的最大值,最小可以是多少?

既然刚开始图不连通也无环,那么就是一些树(特殊情况是点)。

于是题目就变成了,如何把很多棵树连起来,使最后生成的树直径最小。

可以想到,如果把两棵直径为 a 和 b 的树加一条边连成一棵,那么直径最小的新树直径为 (a+1)/2 + (b+1)/2 + 1 (两棵树的直径 / 2,向上取整,的和再加 1)

选择其中一个直径最大的子树,遍历所有其他的子树,然后将其他的子树加到这个子树上面。

求树的直径可以用DP。

这道题场上很快想出来了做法。然后一直T在 test 22。

原因是不会写树的直径DP求法,以及,memset超时。

每次找到新的联通块(新的一棵树)求树的直径就要memset一遍是不需要的。因为那些点肯定是不冲突的。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <stack>
#include <set>
#include <map> using namespace std;
const int maxn = + ; int fa[maxn], dis[maxn], tot = , v[maxn];
bool vis[maxn]; struct Node
{
int v, next, last, z;
}a[maxn]; void build(int x, int y)
{
tot++;
a[tot].v = y;
a[tot].next = a[x].last;
a[x].last = tot;
} void dp(int x, int &ans)
{
v[x] = ;
for (int tmp = a[x].last; tmp; tmp = a[tmp].next)
{
int y = a[tmp].v;
if (v[y]) continue;
dp(y, ans);
ans = max(ans, dis[x] + dis[y] + );
dis[x] = max(dis[x], dis[y] + );
}
} void DFS(int x)
{
vis[x] = true;
for (int tmp = a[x].last; tmp; tmp = a[tmp].next)
{
int y = a[tmp].v;
if (!vis[y]) DFS(y);
}
} int main()
{
int n, m;
scanf("%d%d", &n, &m); int x, y;
for (int i = ; i <= m; i++)
{
scanf("%d%d", &x, &y);
build(x, y);
build(y, x);
} memset(vis, false, sizeof(vis)); memset(v, , sizeof(v));
memset(dis, , sizeof(dis));
int q[maxn], tt = ;
for (int i = ; i < n; i++)
if (!vis[i])
{
int t = ;
dp(i, t);
q[++tt] = t;
DFS(i);
} int ans = , flag = ;
for (int i = ; i <= tt; i++)
if (q[i] > ans)
{
ans = q[i];
flag = i;
} for (int i = ; i <= tt; i++)
if (i != flag)
ans = max(ans, (q[i]+)/+(ans+)/ + );
printf("%d\n", ans); return ;
}

Gym - 100781A Adjoin the Networks (树的直径)的更多相关文章

  1. 【DFS】Gym - 100781A - Adjoin the Networks

    给你一个森林,让你把它连接成一颗树,使得直径最小. 就求出每颗树的重心以后,全都往直径最大的那个的重心上连,一般情况是最大/2+次大/2+1,次大/2+第三大/2+2 中取较大者. 还有些特殊情况要特 ...

  2. codeforces GYM 100781A【树的直径】

    先求出每棵树的直径,排个序,要想图的直径最小的话需要每棵树的直径中点像直径最大的树的直径中点连边,这样直径有三种情况:是直径最大的树的直径:a[tot]:是直径最大的树和直径第二大的树的半径拼起来+1 ...

  3. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  4. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  5. Gym - 100676H Capital City(边强连通分量 + 树的直径)

    H. Capital City[ Color: Black ]Bahosain has become the president of Byteland, he is doing his best t ...

  6. Gym - 100676H H. Capital City (边双连通分量缩点+树的直径)

    https://vjudge.net/problem/Gym-100676H 题意: 给出一个n个城市,城市之间有距离为w的边,现在要选一个中心城市,使得该城市到其余城市的最大距离最短.如果有一些城市 ...

  7. CF GYM 100781A(菊花图+直径)

    题目大意 给出若干颗树用最少的边把它们连成一个无向连通图,同时使图的直径最小.输出最小直径. 题解 我们定义树的半径为(树的直径+1)/2.符合题意的连接方式为.所有树的“中点”连在直径最长的树的中点 ...

  8. hiho 1050 树的直径

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  9. 牡丹江.2014B(图论,树的直径)

    B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

随机推荐

  1. 《深入理解java虚拟机》笔记(6)内存分配与回收策略

    一.垃圾回收日志说明 [GC[DefNew: 7307K->494K(9216K), 0.0043710 secs] 7307K->6638K(19456K), 0.0044894 sec ...

  2. linux文件系统和目录树的关系

    文件系统是和底层的硬件系统紧密关联的,文件系统相当于是dev(设备或硬件)在Linux上面的显示,如/dev/hdc2 而目录树是逻辑的概念,其可以通过挂载的方式连接文件系统,先用df查看本地的文件系 ...

  3. ribbon重试机制

    我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问. 下面的例子 ...

  4. js浮点数乘除法

    JS在处理浮点数计算时经常会遇到精度的问题,上一篇博客封装了JS浮点数加减法的方法,这一次来封装一下js浮点数乘除法运算. 其实浮点除法的封装跟加减法的封装原理是一样,只是在第一次计算完后会再复位小数 ...

  5. JavaScript是什么

    JavaScript是一种解释型语言而不是编译型语言,它往往被认为是一种脚本语言,而不被看作是一种真正的编程语言.也就是说,脚本语言比较简单,它们是非程序员所使用的编程语言. 如果一个程序员对Java ...

  6. 解决easyUI下拉控件无法触发onkeydown事件

    实现在combotree下拉控件中按Backspace键清除combotree选中的值 下面的代码无法获取到键盘事件 <input class="easyui-combotree&qu ...

  7. Ruby菜鸟入门指南

    写这篇文章的初衷源于我的伙伴们在上手Ruby过程中,表现实在是太让人拙计了.由于项目的急功近利,需要迅速入门Ruby并上手项目.所以很多开发者在实际开发过程中,不熟悉Ruby的表达方式,也会沿用其他语 ...

  8. Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)

    Windows基础环境_安装配置教程(Windows7 64.JDK1.8.Android SDK23.0.TortoiseSVN 1.9.5) 安装包版本 1)     JDK版本包 地址: htt ...

  9. 在openSUSE 13.1上用gem安装rails无反应: gem install rails

    解决方案: gem install rails -V ....其实他本身在后台运行,白白的给他中断好多次,用-V这个选项就可以直接回显信息了

  10. MyLinkedList

    /** * 节点类 * @author JP * */ class Node { Object value;//节点元素值 Node pre;//上一个节点 Node next;//下一个节点 pub ...