题目链接:【CSU 1681】

一共有n个点,m条线,每条线将两个点连接在一起,导致这n个点中有些点是连通的有些点是不连通的,加入最少的线,使得n个点两两连通,求每两个点之间最大距离的最小值

树的直径:树上两个点之间的最大距离

每一个连通块就是一棵树,先求出每一棵树的直径,用数组d[]记录,然后从小到大排序,找到最大直径,合并树(直径小的合并到直径大的),更新最大直径

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
const int N=1e5+10;
vector<int>vec[N];
int vis[N], dis[N], maxn, id;
int d[N];
void dfs(int p, int u)
{  vis[u]=1;for(int i = 0; i < vec[u].size(); i++){  int v = vec[u][i];if(p != v){dis[v] = dis[u] + 1;if(maxn < dis[v]){maxn = dis[v];id = v;}dfs(u, v);}}
}
int main()
{int n, m;while(~scanf("%d%d", &n, &m)){for(int i=0; i<n; i++) vec[i].clear();memset(vis, 0, sizeof(vis));int a, b;for(int i=0; i<m; i++){scanf("%d%d", &a, &b);vec[a].push_back(b);vec[b].push_back(a);}int ans=0, len=0;for(int i=0; i<n; i++){if(!vis[i]){memset(dis, 0, sizeof(dis));maxn=0, id=-1;dfs(-1, i);//找到跟点i的距离最大的那个点 if(id!=-1)//id==-1,这棵树只有一个点,树的直径是0 {memset(dis, 0, sizeof(dis));dfs(-1, id);//求树的直径 }d[++len] = maxn;}}sort(d, d+len+1);ans = d[len];for(int i=len-1; i>=0; i--){ans = max((ans+1)/2+(d[i]+1)/2+1, ans);}if(n==1) ans=0;printf("%d\n", ans);}return 0;
}
/*
6 4
0 1
0 2
3 4
3 511 9
0 1
0 3
0 4
1 2
5 4
6 4
7 8
7 9
7 10
*/ 

CSU 1681 Adjoin(树形dp 树的直径)相关推荐

  1. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  2. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  3. POJ - 4045 Power Station(树形dp/树的重心)

    题目链接:点击查看 题目大意:给出一个n个节点的树,我们需要选出一个节点,到其余任何节点的距离和最小 题目分析:这个题我的第一反应是用树的重心,先求出来符合条件的点,然后再跑一遍dfs求距离,最后输出 ...

  4. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

  5. [BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)

    关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 2" role="presentation" style="position: relative ...

  6. 树形结构——树的直径

    树的直径的定义  树的直径:树上最远两点(叶子结点)的距离. 树的直径的求法 例题:[模板]树的直径 两遍暴力dfs 引理:对于树上任意一点 P P P,找到离它最远的节点 Q Q Q.在找到离节点 ...

  7. 「校内训练 2019-04-23」越野赛车问题 动态dp+树的直径

    题目传送门 http://192.168.21.187/problem/1236 http://47.100.137.146/problem/1236 题解 题目中要求的显然是那个状态下的直径嘛. 所 ...

  8. 树形dp——树的重心(2) 代码调试理解

    和树的最大独立问题类似,先任选一个结点作为根节点,把无根树变成有根树,然后设d(i)表示以i为根的子树的结点的个数.不难发现d(i)=∑d(j)+1,j∈s(i).s(i)为i结点的所有儿子结点的编号 ...

  9. 树形dp ——树的重心

    1.只需要求出最大子树中节点数最小的数目即可 题意:有一个国王要把他的领土分给两个儿子,国王的领土是一棵树,N个结点,N-1条边把这些结点连起来,现在大小儿子要选择一个点作为他的首都,那么除首都分别是 ...

  10. 树形dp树的重心(D - Godfather POJ - 3107)

    题目链接:https://cn.vjudge.net/contest/277955#problem/D 题目大意:求树的重心(树的重心指的是树上的某一个点,删掉之后形成的多棵树中节点数最大值最小). ...

最新文章

  1. Qt中如何改变三角形图形项的包围盒
  2. 程序员的身体一定要好
  3. 15个Android通用流行框架大全
  4. linux抓源地址,【Linux】apt-get 源地址汇总
  5. 直播 | ICLR 2021论文解读:兼听则明,信而有征:可信多模态分类
  6. bitmapdata的知识点
  7. [HDOJ5327]Olympiad
  8. Tree Restoration Gym - 101755F (并查集)
  9. Qt加载RGB内存数据,并显示彩色图
  10. tiny-spring 分析
  11. SQL Server与Excel数据互导
  12. paip.声音按键音延迟的解决
  13. DisplayTag用法
  14. DLL注入——使用注册表
  15. 各种通信接口的简单对比
  16. 后台和用户跟踪要点_联系人跟踪应用程序的一些基本要点
  17. Crackme之Acid burn.exe
  18. Kafka 消息中间件
  19. Python: 向量、矩阵和多维数组(基于NumPy库)
  20. VS2005如何加载Word组件(详细步骤)

热门文章

  1. 三体中的思想实验二:黑暗森林(上)
  2. Macbook实用技巧——小白入门必须会的
  3. umount 无法成功
  4. YOLOX测试-VOC格式
  5. 计算机技术和教育,计算机技术和现代数学教育
  6. 一些免费在线杀毒网址
  7. 知识众筹服务平台网盘[入口]
  8. 挑战全网目前最全python例子(附源码),独此一家,经典值得收藏!!!(五):Python绘图,Python实战
  9. LaTeX:大于等于号,小于等于号,大于号,小于号
  10. shell编程之awk(数据筛选与处理)