Codefroces Gym 100781A(树上最长路径)
http://codeforces.com/gym/100781/attachments
题意:有N个点,M条边,问对两两之间的树添加一条边之后,让整棵大树最远的点对之间的距离最近,问这个最近距离是多少。
思路:一开始看成只有两个连通块,后来才注意到是多个连通块。DFS搜树上最长路径。答案有三种:第一种是添加了边之后,树的最长路径还是原来子树的路径,第二种是对子树长度进行排序后,两个最长的距离分别除以2向上取整后加上1。第三种比较难注意到,就是第二第三长的分别除以2向上取整后加上2,因为可能隔着一条边之后比第一种情况更长了。
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <queue>
- #include <vector>
- using namespace std;
- #define N 100010
- struct node
- {
- int v, nxt;
- }edge[N*];
- int head[N], tot;
- bool vis[N];
- int ans[N];
- int l;
- void add(int u, int v)
- {
- edge[tot].v = v; edge[tot].nxt = head[u]; head[u] = tot++;
- }
- bool cmp(const int &a, const int &b)
- {
- return a > b;
- }
- int dfs(int u)
- {
- vis[u] = ;
- int m1 = , m2 = ;
- for(int i = head[u]; ~i; i = edge[i].nxt) {
- int v = edge[i].v;
- if(vis[v]) continue;
- int tmp = dfs(v) + ;
- if(tmp > m1) {
- m2 = m1, m1 = tmp;
- } else if(tmp > m2) {
- m2 = tmp;
- }
- }
- if((m1 + m2) > l) l = m1 + m2;
- return m1;
- }
- int main()
- {
- int n, m;
- scanf("%d%d", &n, &m);
- memset(vis, , sizeof(vis));
- memset(head, -, sizeof(head));
- memset(ans, , sizeof(ans));
- tot = ;
- for(int i = ; i < m; i++) {
- int u, v;
- scanf("%d%d", &u, &v);
- add(u, v); add(v, u);
- }
- int cnt = , res = ;
- for(int i = ; i < n; i++) {
- if(!vis[i]) {
- l = ;
- dfs(i); //搜树上最长路径
- if(l > res) res = l; //第一种情况
- ans[cnt++] = l;
- }
- }
- sort(ans, ans + cnt, cmp);
- if(cnt > ) res = max(res, (ans[] + ) / + (ans[] + ) / + ); //第二种情况
- if(cnt > ) res = max(res, (ans[] + ) / + (ans[] + ) / + ); //第三种情况
- printf("%d\n", res);
- return ;
- }
Codefroces Gym 100781A(树上最长路径)的更多相关文章
- 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
Walking Race Description flymouse's sister wc is very capable at sports and her favorite event is ...
- SPOJ 1825 经过不超过K个黑点的树上最长路径 点分治
每一次枚举到重心 按子树中的黑点数SORT一下 启发式合并 #include<cstdio> #include<cstring> #include<algorithm&g ...
- poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...
- HDU 2196 Computer (树上最长路)【树形DP】
<题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...
- ubuntu 终端设置(颜色与长路径)
Linux给人最大的享受就是可以根据个人喜好去定制令自己舒服的系统配置,像终端颜色的设置就是一个典型的例子. 图1 系统默认状态下的终端显示 在没有经过自定义配置的终端下工作久了,难免容易疲劳 ...
- hdu 4607 Park Visit(树上最长链)
求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...
- 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...
- hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- AOE网上的关键路径(最长路径 + 打印路径)
题目描述 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图. AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG ...
随机推荐
- Vue.2.0.5-自定义指令
简介 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令.注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件--然而,有的情况下,你仍然需要对纯 D ...
- :before 和 :after 的内幕 以及伪类 ( 转 )
原文链接 http://www.cnblogs.com/zhujl/archive/2012/05/08/2489411.html ------------------------------- ...
- linix container & cgroup note
1,Containers can run instructions native to the core CPU without any special interpretation mechanis ...
- mysql之innodb_buffer_pool
1>.mysqld重启之后,innodb_buffer_pool几乎是空的,没有任何的缓存数据.随着sql语句的执行,table中的数据以及index 逐渐被填充到buffer pool里面,之 ...
- Process启动.exe,当.exe内部抛出异常时,总会弹出一个错误提示框,阻止Process进入结束
public class TaskProcess { [DllImport("kernel32.dll", SetLastError = true)] public static ...
- MD5和DES加密方法
/// <summary> /// MD5加密 /// </summary> /// <param name=&q ...
- SpringMVC注解@RequestParam全面解析
在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...
- codevs 1201 最小数和最大数
http://codevs.cn/problem/1201/ 1201 最小数和最大数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题 ...
- MES: ESB
ESB定义了消息的收发和收发池,对于各种通讯方式定义了收发API,在收到信息后由eventBus来发布消息 ISender: public abstract interface ISender { p ...
- 每天一个shell知识--数组
1.shell中数组的定义: 数组名=(value value1 value2 ) 也可以单独的设定数组的分量: arrayL[0]=value arrayL[1]=value1 2.${arrayL ...