hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1
如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp
选一个点当根每次求出一点到子节点的最大距离和次大距离,两个的和最大的就是树的直径
还在网上看到一种方法,任意一点广搜达到最远点max,再从max广搜,到达最远点就是树的直径
自己想了想这种方法:如果中间有点有分支的话,那么这点的最大分支一定是到max的
但是它的次大分支就不一定是到起点的,所以从max搜的话肯定是到这点的次大分支,就是直径了
#include<stdio.h>
#include<string.h>
#define N 100001
int head[N],num,ins[N],n;
struct edge
{
int ed,next;
}E[N*2];
void addedge(int x,int y)
{
E[num].ed=y;
E[num].next=head[x];
head[x]=num++;
}
int dis;
int dist(int u)
{
ins[u]=1;
int max=0,mmax=0;
for(int i=head[u];i!=-1;i=E[i].next)
{
int v=E[i].ed;
if(ins[v]==1)continue;
int temp=dist(v);
if(temp>mmax)
{
max=mmax;
mmax=temp;
}
else if(temp>max)
{
max=temp;
}
}
if(dis<(mmax+max+1))
dis=mmax+max+1;
return mmax+1;
}
int main()
{
int i,m,x,y,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
num=0;
for(i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
memset(ins,0,sizeof(ins));
dis=0;
dist(1);
for(i=1;i<=m;i++)
{
scanf("%d",&x);
if(x<=dis)
printf("%d\n",x-1);
else printf("%d\n",dis+(x-dis)*2-1);
}
}
return 0;
}
#include<stdio.h>
#include<queue>
#include<string.h>
#define N 100001
using namespace std;
int head[N],num,vis[N],n;
struct edge
{
int ed,next;
}E[N*2];
struct node
{
int x,w;
}cur,next;
void addedge(int x,int y)
{
E[num].ed=y;
E[num].next=head[x];
head[x]=num++;
}
int dist()
{
int i,v;
memset(vis,0,sizeof(vis));
queue<node>Q1,Q2;
cur.x=1;
Q1.push(cur);
while(!Q1.empty())
{
cur=Q1.front();
Q1.pop();
vis[cur.x]=1;
for(i=head[cur.x];i!=-1;i=E[i].next)
{
next.x=v=E[i].ed;
if(vis[v]==0)
Q1.push(next);
}
}
cur.w=1;
Q2.push(cur);//广搜最后出来的点一点是最远点
memset(vis,0,sizeof(vis));
while(!Q2.empty())
{
cur=Q2.front();
Q2.pop();
vis[cur.x]=1;
for(i=head[cur.x];i!=-1;i=E[i].next)
{
next.x=v=E[i].ed;
next.w=cur.w+1;
if(vis[v]==0)
Q2.push(next);
}
}
return cur.w;
}
int main()
{
int i,m,x,y,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
num=0;
for(i=0;i<n-1;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
int dis=dist();
for(i=1;i<=m;i++)
{
scanf("%d",&x);
if(x<=dis)
printf("%d\n",x-1);
else printf("%d\n",dis+(x-dis)*2-1);
}
}
return 0;
}
hdu 4607 (树形DP)的更多相关文章
- hdu 4607 树形dp 树的直径
题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- HDU 1520 树形dp裸题
1.HDU 1520 Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...
- HDU 1561 树形DP入门
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2196树形DP(2个方向)
HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...
- HDU 1520 树形DP入门
HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...
- codevs 1380/HDU 1520 树形dp
1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...
- HDU 5834 [树形dp]
/* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...
- hdu 4267 树形DP
思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...
随机推荐
- 图形学:图像围绕着某个点P(a,b)旋转------白话版
前提:在研究图形时候,我们并没有规定图形的大小,所以任意图形多是支持的,这也另外说明了一点,图形转换和图形的大小没有关系. 如果图像围绕着某个点P(a,b)旋转,则先要将坐标系平移到该点,再进行旋转, ...
- Source Insight的应用技巧、宏功能
目录 1 简介... 5 2 搭建我们的SI环境... 5 2.1 搭建步骤... 5 2.2 说明... 6 3 应用技巧... 6 3.1 初级应用技巧... 6 3.1.1 解决字体不等宽与对齐 ...
- java:I/O 往原文件追加内容
原来txt内容: "我要添加内容" import java.io.*; class Test { public static void main(String[] args) { ...
- 去除右键菜单opendlg
环境:windows8.1专业版 未知文件类型,右键会多出一个opendlg的选项!下面是移除的方法: 将下面的内容复制到记事本,并另存为XXX .reg,导入注册表即可! Windows Reg ...
- 几种必知的oracle结构图
一.数据库结构 二.Oracle 内存结构 三.进程结构 1. 用户进程:在数据库用户请求连接到Oracle 服务器时启动 2. 服务器进程:可以连接到Oracle实例,它在用户建立会话时启动 3. ...
- socket关闭动作以及socket状态的总结
主要部分,四次握手: 断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接.这里先暂时说正常情况.当调用close ...
- PHP开发搜索引擎技术全解析
谈到网页搜索引擎时,很多人都会想到雅虎.的确,雅虎开创了一个互联网络的搜索时代.然而,雅虎目前用于搜索网页的技术却并非该公司原先自己开发的.2000年8月,雅虎采用了Google这家由斯坦福大学学生创 ...
- JXL获取excel批注
/** * Jxl.jar(2.6.12) * @author lmiky * @date 2011-11-26 */ public class JxlTest { /** * 测试获取批注 * @a ...
- UVa 10214 (莫比乌斯反演 or 欧拉函数) Trees in a Wood.
题意: 这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N 分析: 坐标轴上有四个可见的点,因为每个象限可见的点数都是一样 ...
- [POJ 1365] Prime Land
Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3211 Accepted: 1473 Descri ...