问题描述

LG-CF455C


题解

首先,题目给出了 \(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 树的直径的更多相关文章

  1. Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

    题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点 ...

  2. CF455C Civilization (并查集)

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

  3. Codeforces Round #260 (Div. 1) C. Civilization 树的中心+并查集

    题目链接: 题目 C. Civilization time limit per test1 second memory limit per test256 megabytes inputstandar ...

  4. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  5. poj1985 Cow Marathon (求树的直径)

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3195   Accepted: 1596 Case ...

  6. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  7. poj2631 树的直径

    设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...

  8. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

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

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

随机推荐

  1. css发展史

      (接着上次博客的内容,现在我们进入css基础)   外部样式表  <link> 内部样式表  <style> 行内样式表  style  (多用于JS) * css注释   ...

  2. 浅谈状态压缩DP

    浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...

  3. UmiJS 目录及约定

    在文件和目录的组织上,umi 更倾向于选择约定的方式. 一个复杂应用的目录结构如下: . ├── dist/ // 默认的 build 输出目录 ├── mock/ // mock 文件所在目录,基于 ...

  4. JDBC释放数据库连接

    try(){}写法会自动关闭连接 String sql = "select password from user where name = ?"; try(Connection c ...

  5. vue项目中引入iconfont

    背景 对于前端而言,图标的发展可谓日新月异.从img标签,到雪碧图,再到字体图标,svg,甚至svg也有了类似于雪碧图的方案svg-sprite-loader.雪碧图没有什么好讲的了,只是简单地利用了 ...

  6. go-运算符

    算术运算符 ++,--只能放在变量后面,不能放在前面 独立使用 目的:更简洁 go语言不支持三元运算符 键盘输入 fmt.scanln 会在换行时扫描,所以最后一个条目必须换行或达到结束位置 fmt. ...

  7. java基础(22):File、递归

    1. File 1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序 ...

  8. java基础(7):自定义类、ArrayList集合

    1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...

  9. 树莓派4B到货开箱体验

    树莓派4B到货开箱体验 实不相瞒,喜欢这块板已经很久了,但是国内4GB内存的版本始终没货,.....等等等,终于到货了,迅雷不及眼耳之势赶紧下单...购买点亮开发板所需要的物件 顺便看到一个好看的外壳 ...

  10. GO基础之函数

    一.Go语言函数的格式 函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func.函数名.参数列表.返回值.函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块. 函 ...