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 ...
随机推荐
- MapReduce编程系列 — 3:数据去重
1.项目名称: 2.程序代码: package com.dedup; import java.io.IOException; import org.apache.hadoop.conf.Configu ...
- 类似百度文库pdf2swf+flexpaper解决pdf在线阅读的效果
1:工具准备swftools.exe 下载http://www.swftools.org/download.html 安装至D盘SWFTools提供了一系列将各种文件转成swf的工具:font2swf ...
- objective-C 自定义对象归档的实现
自定义对象要实现归档必须实现NSCoding协议 NSCoding协议有两个方法,encodeWithCoder方法对对象的属性数据做编码处理,initWithCoder解码归档数据来初始化对象. # ...
- 【iOS开发】iOS7 兼容及部分细节
1:statusBar字体为白色 在plist里面设置View controller-based status bar appearance 为 NO:设置statusBarStyle 为 UISta ...
- (转)CAP理论十二年回顾:"规则"变了
编者按:由InfoQ主办的全球架构师峰会将于2012年8月10日-12日在深圳举行,为了更好地诠释架构的意义.方法和实践,InfoQ中文站近期会集中发布一批与架构相关的文章,本篇即为其中之一.Info ...
- MAC 上搭建lua环境
一.下载并安装 (1)最新release版下载地址 http://www.lua.org/ftp/lua-5.3.1.tar.gz (2)编译 Building Lua is implemented ...
- eclipse 中创建maven web项目
Maven的Eclipse插件m2eclipse在线安装地址 http://m2eclipse.sonatype.org/sites/m2e:我又试了link方式安装也没什么作用,不知怎么回事? 还有 ...
- vbox android x86 分辨率
D:\Program Files\Oracle\VirtualBox>VBoxManage setextradata "android" "CustomVideoM ...
- 读取Excel任务列表并显示在Outlook日历上
前几天,公司发了一个任务安排,时间不固定,但要求准时到,为了给自己加一个提醒,也为了回顾一下以前的技术,特做了一个Demo. 读取Excel就不多说了,代码很简单,但支持老版本Excel和的版本Exc ...
- Linux 根文件系统制作
1.创建根文件目录 mkdir rootfs(名字是随便取的) 2.创建子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp va ...