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 ...
随机推荐
- cocos2d-x 扩充引擎基类功能 引起的头文件重复包含问题的分析
c++ 头文件包含 原因的分析: c++ 头文件的循环引用是指: .h 里面的里面的头文件的相互包含的,引起的重复引用的问题.cpp 里面包含头文件是不存在重复引用的问题(因为CPP没有#ifn ...
- 【Deep Learning学习笔记】Efficient Estimation of Word Representations in Vector Space_google2013
标题:Efficient Estimation of Word Representations in Vector Space 作者:Tomas Mikolov 发表于:ICLR 2013 主要内容: ...
- linux编译注解
Linux kernel release 3.x <http://kernel.org/> These are the release notes for Linux version 3. ...
- WinCE下VPN设置
一.环境 1. WinCE5.0+2004/2005/2006/2007补丁. 2. 3G拨号模块. 二.说明 1. WinCE设备必须可以接入网络. 2. 支 ...
- 微软嵌入式WEC2013产品研讨会(深圳站---2013.10.16)
主要内容如下: 1. Windows Embedded Compact 2013面向的市场 主要面向工业自动化.医疗设备和零售行业这些市场,和物联网关系非常紧密. 2. Windo ...
- Ubuntu设置中文
Ubuntu设置中文:需要联网下载中文包,不然无法设置中文系统. 进去系统后再右上角有个齿轮图标点击,找到系统设置(System Settings)点击弹出一个界面,找到Language Suppor ...
- 从Excel表格导入数据到数据库
数据库:SQL 1.小数据直接粘贴 2.用导入向导 3.用SSIS包 4.用SQL语句 现在详细说一下第4种方法,以.xlsx文件为例 .xlsx文件需要用provider“Microsoft.ACE ...
- Unity3D集成SVN进行版本控制
首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对.但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有 ...
- JQuery设置与获取RadioButtonList和CheckBoxList的值
有这样一个问题,要获取ASP.NET控件RadioButtonList的值,首先想到的就是$("#<%=RadioButtonList1.ClientID %>").v ...
- Self-Paced Training (1) - Introduction to Docker
helloworld: wget -qo- https://get.docker.com/ | sh sudo docker run hello-world sudo usermod -aG dock ...