题解 P2195 【HXY造公园】
天哪这道题竟然只有一篇题解!
emm,首先读题看完两个操作就已经有很明确的思路了,显然是并查集+树的直径 一波解决。
并查集不多说了,如果不了解的可以看这里.
树的直径的思路很朴实,就是两边DFS(BFS也OK)。具体先随便找一个节点,然后搜一遍,找到最远的,然后再搜一遍,这样合在一起就一定是最长的了。
不过呢这道题还是注意一下求直径的公式,具体如下:
$D_new=max(D_u,D_v,[D_u/2]+[D_v/2]+1)$
那个方括号指的是取整(没找到在哪里打出来)。
en除此之外好像没什么好说的。。。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std; const int maxn=; int n,m,q,max_i,max_v;
int f[maxn],len[maxn],sz[maxn];
bool used[maxn];
vector<int>g[maxn]; void dfs(int val,int depth,int pos){
if(depth>max_i){
max_i=depth;
max_v=val;
}
for(int i=;i<g[val].size();i++){
if(g[val][i]!=pos)dfs(g[val][i],depth+,val);
}
} int calc(int val){
max_i=-;
dfs(val,,-);
max_i=-;
dfs(max_v,,-);
return max_i;
} int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
} void merge(int x,int y){
x=find(x),y=find(y);
if(sz[x]>sz[y])swap(x,y);
sz[y]+=sz[x];
f[x]=y;
} int radius(int x){
return (len[x]+)/;
} void merge2(int x,int y){
x=find(x),y=find(y);
if(x==y)return;
if(sz[x]>sz[y])swap(x,y);
sz[y]+=sz[x];
f[x]=y;
len[y]=max(max(radius(x)+radius(y)+,len[x]),len[y]);
} int main() {
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++){
f[i]=i;
sz[i]=i;
len[i]=;
}
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
merge(x,y);
}
for(int i=;i<=n;i++){
int p=find(i);
if(!used[p]){
used[p]=;
len[p]=calc(i);
}
}
while(q--){
int t,x,y;
scanf("%d",&t);
if(t==){
scanf("%d",&x);
printf("%d\n",len[find(x)]);
}else{
scanf("%d%d",&x,&y);
merge2(x,y);
}
}
}
题解 P2195 【HXY造公园】的更多相关文章
- 洛谷 P2195 HXY造公园
P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...
- 洛谷 P2195 HXY造公园 解题报告
P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...
- 【luogu P2195 HXY造公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...
- CF455C Civilization | luogu HXY造公园
题目链接: https://www.luogu.org/problemnew/show/P2195 http://codeforces.com/contest/455/problem/C 显然我们可以 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- NOIP前刷题记录
因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...
- NOIP刷题
搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...
- 【图论 动态规划拆点】luoguP3953 逛公园
经典的动态规划拆点问题. 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 NN 个点 MM 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, NN 号点是公园的出口,每条边有一个非负 ...
- poj1083 贪心
K - 简单dp Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB 64bit ...
随机推荐
- Android 设置AlertDialog的大小 .
AlertDialog dialog = builder.setTitle("消息列表") .setView(layout) .create(); dialog.show(); / ...
- 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...
- vue 事件上加阻止冒泡 阻止默认事件
重点 vue事件修饰符 <!-- 阻止单击事件冒泡 --> <a v-on:click.stop="doThis"></a> <!-- 提 ...
- str 数据类型的用法
---------------------------------------------------------------------------------------------------- ...
- C语言传参的类型匹配
有一个这样的问题: 形参const char *p和实参char *c可以匹配 形参const char**p和实参char**c不可以匹配 注:argument和parameter:严格而言,par ...
- spring中IOC的简单使用
spring的ioc主要就是依赖注入,有基于构造器的依赖注入还有通过设值注入,这里我只简单的实现设值注入的方法,通过spring的依赖管理,我们可以很方便的了解各层之间的依赖关系,降低了各层之间的耦合 ...
- 2015 Multi-University Training Contest 3 hdu 5316 Magician
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- nginx php No input file specified 怎样处理?
配置nginx支持php 出现了No input file specified ? 仅仅要改动下安装文件夹下的 nginx.conf下的 location ~ \.php$ { ...
- new 对象和Class的getInstance()方法的差别?
创建对象时的差别 1.new 对象包含2步, 1)载入类: 2)而且实例化. 2.Class的对象.getInstance(),只不过实例化. 也就是说.在运行 Class的对象.getInstanc ...
- IP地址的规划和设计方法(二)
五,IP地址规划方法 (1)IP地址规划的基本步骤 网络地址规划须要按下面6步进行: a)推断用户对网络与主机数的需求: ...