loj 1412(树上最长直径的应用)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1412
思路:好久没写题解了,有点手生,这题从昨天晚上wa到现在终于是过了。。。思想其实很简单,就是预处理出每一块的最长直径,然后每次询问的时候直接查询就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int MAXN = ( + );
typedef pair<int,int>Pair; vector<int >g[MAXN];
vector<Pair >blocks;
int n,m,q,len,_count,max_len;
bool mark[MAXN]; int dfs(int u,int father)
{
if(!mark[u])mark[u] = true, _count ++;
int first = , second = ;
for(int i = ; i < (int)g[u].size(); i ++) {
int v = g[u][i];
if(v == father)continue;
int tmp = dfs(g[u][i],u) + ;
if(tmp > first)second = first, first = tmp;
else if(tmp > second)second = tmp;
}
if(first + second > len)len = first + second;
return first;
} int cmp(Pair p, Pair q)
{
if(p.second != q.second){
return p.second > q.second;
}else
return p.first > q.first;
} int main()
{
int u,v,_case,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)g[i].clear();
while(m--){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
len=;
max_len = ;
memset(mark,false,sizeof(mark));
blocks.clear();
for(int i=;i<=n;i++){
if(!mark[i]){
len=;
_count = ;
dfs(i,-);
blocks.push_back(make_pair(len,_count));
max_len = max(max_len,len);
}
}
sort(blocks.begin(),blocks.end(),cmp);
scanf("%d",&q);
printf("Case %d:\n",t++);
while(q--){
int k;
scanf("%d",&k);
if(k > blocks[].second){
puts("impossible");
}else if(k <= max_len + ){
printf("%d\n",k - );
}else {
int ans = ( << );
for(int i=; i<(int)blocks.size(); i++){
if(k > blocks[i].second)break;
ans = min (ans, (blocks[i].first)+*(k-blocks[i].first-));
}
printf("%d\n",ans);
}
} }
return ;
}
loj 1412(树上最长直径的应用)的更多相关文章
- poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...
- 牛客小白月赛6 C 桃花 dfs 求树上最长直径
链接:https://www.nowcoder.com/acm/contest/136/C来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
- Codefroces Gym 100781A(树上最长路径)
http://codeforces.com/gym/100781/attachments 题意:有N个点,M条边,问对两两之间的树添加一条边之后,让整棵大树最远的点对之间的距离最近,问这个最近距离是多 ...
- 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 ...
- [HDU4607]Park Visit(树上最长链)
HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
Walking Race Description flymouse's sister wc is very capable at sports and her favorite event is ...
- 树上最长链 Farthest Nodes in a Tree LightOJ - 1094 && [ZJOI2007]捉迷藏 && 最长链
树上最远点对(树的直径) 做法1:树形dp 最长路一定是经过树上的某一个节点的. 因此: an1[i],an2[i]分别表示一个点向下的最长链和次长链,次长链不存在就设为0:这两者很容易求 an3[i ...
随机推荐
- C++实现VPN工具之代码示例
创建.连接.挂断.删除VPN实现起来并不难,下面给出一套比较完整的代码.该段代码只是示例代码,但是已经通过了编译,对API的使用和VPN操作步骤是没问题的.具体每个API代表的意义可以参看<C+ ...
- oracle 学习
一.数据库语言部分1. SQL语言:关系数据库的标准语言2. PL/SQL:过程化语言Procedural Language3. SQL*Plus:简单的报表,操作系统接口 4. Oracle 8.0 ...
- Java for LeetCode 223 Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
- ABAP 供应商、工厂对应公里数维护
*&---------------------------------------------------------------------* *& Report ZMMR011 ...
- windows server 2008 配置安装AD 域控制器
工作需要,搞起AD域来,具体配置如下: 配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 配 ...
- apache vhost
httpd.conf: Include "F:/wamp/alias/*" <Directory "F:\wamp\www"> Options ...
- python 获取控制台输入
python想从控制台获取输入的的函数有两个一个是raw_input,一个是input. 这两个函数的区别是input获取的时候会精确到类型,假设输入的是1,那么获取的就是int型的变量,如果想输入字 ...
- Jams倒酒
Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为a ml 和 b ml的酒杯来装载. 酒吧的生意并不好.Jams发现酒鬼们都很穷,不像他那么土豪.有时,他们 ...
- Mysql子查询
1单值(Scalar operand) 只有当外层(Parent)不为空时,才返回相应值:否则返回NULL. note:For the subquery just shown, if t1 were ...
- Linux 压缩系列常用命令
tar 命令: http://man.linuxde.net/tar zip 命令: http://man.linuxde.net/zip unzip 命令: http://man.linuxde.n ...