题目链接:

https://www.luogu.org/problemnew/show/P2195

http://codeforces.com/contest/455/problem/C

显然我们可以想到要用并查集来维护联通节点的信息。

然后题目要求的是合并之后树的直径最小。

然后我们可以知道在两个树的中点合并是最好的。所以我们设\(len[i]\)为i所在树的直径,那么按照上述策略,合并\(i,j\)之后新树的直径就是\(max(len[i],len[j],(len[i]+1)/2+(len[j]+1)/2+1)\)

接下来就是。。树的直径怎么求?

两遍bfs或者dfs就行了qwq

第一遍先找到当前点最远的点pos,之后从pos开始找离pos最远的点到pos的距离就是树的直径了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define MAXN 300010
using namespace std;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,m,que,edge_number,pos,ans,root;
int fa[MAXN],len[MAXN],head[MAXN],done[MAXN],dis[MAXN];
struct Edge{int nxt,to;}edge[MAXN<<1];
inline int maxx(int x,int y,int z){return max(max(x,y),z);}
inline void add(int from,int to)
{
edge[++edge_number].to=to;
edge[edge_number].nxt=head[from];
head[from]=edge_number;
}
inline int find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
inline void merge(int x,int y)
{
int a=find(x),b=find(y);
if(a==b) return;
if(len[a]<len[b]) swap(a,b);
fa[b]=a;
len[a]=maxx(len[a],len[b],(len[a]+1)/2+(len[b]+1)/2+1);
}
inline void search(int now,int pre,int sum)
{
fa[now]=root;
if(sum>ans)
ans=sum,pos=now;
for(int i=head[now];i;i=edge[i].nxt)
if(edge[i].to!=pre)
search(edge[i].to,now,sum+1);
}
int main()
{
n=read(),m=read(),que=read();
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int u,v;
u=read(),v=read();
add(u,v);
add(v,u);
}
for(int i=1;i<=n;i++)
{
if(fa[i]!=i) continue;
root=pos=i;
ans=0;
search(i,0,0);
ans=0;
search(pos,0,0);
len[i]=ans;
}
for(int i=1;i<=que;i++)
{
int name,u,v,k;
name=read();
if(name==2)
u=read(),v=read(),merge(u,v);
else
k=read(),printf("%d\n",len[find(k)]);
}
return 0;
}

CF455C Civilization | luogu HXY造公园的更多相关文章

  1. 洛谷 P2195 HXY造公园 解题报告

    P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...

  2. 洛谷 P2195 HXY造公园

    P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...

  3. 【luogu P2195 HXY造公园】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...

  4. 题解 P2195 【HXY造公园】

    天哪这道题竟然只有一篇题解! emm,首先读题看完两个操作就已经有很明确的思路了,显然是并查集+树的直径 一波解决. 并查集不多说了,如果不了解的可以看这里. 树的直径的思路很朴实,就是两边DFS(B ...

  5. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  6. CF455C Civilization (并查集)

    CF456E Codeforces Round #260 (Div. 1) C Codeforces Round #260 (Div. 2) E http://codeforces.com/conte ...

  7. 【luogu P3953 逛公园】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3953 题外话:感觉2017年神题好多..这还不是最神的一道,真在考场上我也就写个最短路计数暴力了.现在在大佬 ...

  8. luogu 3953 逛公园

    noip2017 D1T3 逛公园 某zz选手看到数据范围直接就最短路计数了,结果写错了爆零 题目大意: N个点M条边构成的有向图,且没有自环和重边.其中1号点是起点,N号点是公园的终点,每条边有一个 ...

  9. Luogu P3953 逛公园(最短路+记忆化搜索)

    P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...

随机推荐

  1. Java 单例模式详解(转)

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...

  2. TI XDC工具入门简介

    1. XDC(Express DSP Component)是TI提供的一个命令行工具,它可以生成并使用实时软件组件包,它包括一系列工具,这些工具可以允许你将你的C语言代码组织成类似于java的包管理方 ...

  3. apt 查询软件

    apt-cache search percona-server apt list percona-server-server-5.6

  4. AssetBundle依赖

    [Managing asset dependencies] 一个Asset会依赖其它Asset.可以把一个Asset所依赖的Asset也打包进自己的AssetBundle.可是多个Asset可能依赖同 ...

  5. bash's parameter expansion

    [bash's parameter expansion] #: find first from left, remove-left ##: find last from left, remove le ...

  6. PHP获取当前文件路径

    __FILE__ 是当前路径+文件名dirname(__FILE__)返回当前文件路径的路径部分 例如当前文件是 /home/data/demo/demo.php ,则 __FILE__ 得到的就是完 ...

  7. word 标题序号

    设置标题的序号. 1>设置二级标题的序号  步骤一: 步骤二: 步骤三: 步骤四: 2>设置三级标题的序号 程序员的基础教程:菜鸟程序员

  8. Mysql蠕虫复制

    将查询出来的数据插入到指定表中,形如: INSERT into user_info(version,create_user_count,create_pc_count) select version, ...

  9. 二项分布&超几何分布

    伯努利分布  在一次试验中,事件A出现的概率为p,不出现的概率为q=1-p.若以β记事件A出现的次数,则β仅取0,1两值,相应的概率分布为: 二项分布是指在只有两个结果的n次独立的伯努利试验中,所期望 ...

  10. myisam innodb memory 区别(2)

    1.区别:1) MyISAM管理非事务表.提供高速存储和检索,以及全文搜索能力.MyISAM在所有MySQL配置里被支持,是默认的存储引擎,除非配置MySQL默认使用另外一个引擎.2)MEMORY存储 ...