CF455C Civilization 树的直径
问题描述
题解
首先,题目给出了 \(m\) 条边,对这 \(n\) 个点, \(m\) 条边组成的森林,跑出每棵树的直径,同时使用并查集维护树的连通性。
考虑合并两棵树的情况:设这两棵树的代表元为 \(u,v\) ,这棵树的直径有三种来源:
\(u\) 这棵树的直径
\(v\) 这棵树的直径
穿过 \(u,v\) 合并边的一条路径
\(u,v\) 两棵树的直径是已知的,所以我们只需要考虑最小化第三种情况。
设树 \(u,v\) 合并时的点为 \(rt_u,rt_v\) ,此时第三种情况的值为 \(\frac{maxdis_{rt_u}}{2}+\frac{maxdis_{rt_v}}{2}+1\)
显然,为了最小化两个 \(maxdis\) ,这两个点选取的一定是原来两棵树直径的中点。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=300007;
const int maxm=600007;
int n,m,T;
vector<int> G[maxn];
int fa[maxn];
int bel[maxn],cnt;
void add(int x,int y){
G[x].push_back(y);
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int dep[maxn],ans[maxn];
int pos,lst;
void merge(int x,int y){
if(find(x)!=find(y)) fa[fa[x]]=fa[y];
}
void dfs(int x,int col,int dis){
if(bel[x]==col) return;
if(dis>=lst) lst=dis,pos=x;
bel[x]=col;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
merge(x,y);
dfs(y,col,dis+1);
}
}
void Getmax(){
int mx=-1;
for(int i=1;i<=n;i++){
if(dep[i]>mx) mx=dep[i],pos=i;
}
}
void cz1(){
int x;read(x);
printf("%d\n",ans[find(x)]);
}
void cz2(){
int x,y;read(x);read(y);
int xx=find(x),yy=find(y);
if(xx==yy) return;
fa[xx]=yy;
ans[yy]=max(ans[xx],max(ans[yy],(ans[xx]+1)/2+(ans[yy]+1)/2+1));
}
void preprocess(){
for(int i=1;i<=n;i++) fa[i]=i;
}
int main(){
read(n);read(m);read(T);
preprocess();
for(int i=1,x,y;i<=m;i++){
read(x);read(y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++){
if(bel[i]) continue;
lst=0,pos=i;
dfs(i,i,0);
lst=0;
dfs(pos,pos,0);
ans[find(i)]=lst;
}
int op;
while(T--){
read(op);
if(op==1) cz1();
else cz2();
}
return 0;
}
CF455C Civilization 树的直径的更多相关文章
- Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】
题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点 ...
- CF455C Civilization (并查集)
CF456E Codeforces Round #260 (Div. 1) C Codeforces Round #260 (Div. 2) E http://codeforces.com/conte ...
- Codeforces Round #260 (Div. 1) C. Civilization 树的中心+并查集
题目链接: 题目 C. Civilization time limit per test1 second memory limit per test256 megabytes inputstandar ...
- poj2631 求树的直径裸题
题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...
- poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- poj2631 树的直径
设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
- 牡丹江.2014B(图论,树的直径)
B - Building Fire Stations Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & ...
随机推荐
- WPF 快捷键
原文:WPF 快捷键 <p><pre name="code" class="csharp"> 前台 <Window.Resourc ...
- WPf 带滚动条WrapPanel 自动换行 和控件右键菜单
原文:WPf 带滚动条WrapPanel 自动换行 和控件右键菜单 技能点包括 WPf 样式的引用 数据的验证和绑定 比较适合初学者 前台: <Window.Resources> < ...
- nginx--代理和负载均衡
nginx代理 nginx的代理分为正向代理和反向代理 正向代理指的是,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原 ...
- 趣谈Linux操作系统学习笔记:第二十一讲
一.分段机制 1.分段机制的原理图 2.段选择子 3.段偏移量 例如,我们将上面的虚拟空间分成以下 4 个段,用 0-3 来编号.每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示. 4. ...
- python3编码问题总结
关于python3的编码类型,到底是怎么编码的,一直使我比较疑惑,在看了网上很多帖子之后,经过自己尝试与实验,将自己的总结写在下面,一是当做一次笔记,二是希望网友们能指正.仅供参考,欢迎指正,谢谢!! ...
- Java中Set与Set<?>到底区别在哪?
您可能知道,无界通配符 Set<?> 可以容纳任何类型的元素,而原始类型Set也可以容纳任何类型的元素.那它们之间有什么区别呢? 1.关于Set<?>的两个事实 关于Set&l ...
- 查询安装webpack4.0是否成功时提示无法找到的解决方法
最近使用webpack -v 查询webpack版本时提示无法找到 然后我试着重新全局安装webpack,提示还需要安装webpack-cli 选择yes后虽能成功安装webp ...
- 多线程通信的两种方式? (可重入锁ReentrantLock和Object)
(一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...
- [05]ASP.NET Core 中的 Main 方法
ASP.NET Core 中的 Main 方法 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ASP.NE ...
- MongoDB for OPS 01:服务介绍与基本使用
写在前面的话 数据库产品已经学习了两个,MySQL 和 Redis.接下来开始研究另外一款 NoSQL 产品 MongoDB,注意跟芒果没啥关系.该产品对于运维来说,相对于操作少一些. 关于 Mong ...