HDU 5758 Explorer Bo
思维,树形$dp$。
首先选择一个度不为$0$的节点作为根节点,将树无根转有根。
这题的突破口就是要求瞬间移动的次数最少。
次数最少,必然是一个叶子节点走到另一个叶子节点,然后瞬间移动一次,再从一个叶子节点走到另一个叶子节点,然后瞬间移动一次……
因为叶子节点总数可能是奇数,可能是偶数,那么接下来要分类讨论一下了。
叶子节点总数为偶数:
这种情况下,叶子节点可以两两配对。如果 下面叶子节点个数是偶数,那么$<u,v>$这条边通过的次数就是$2$;如果$v$下面叶子节点个数是偶数,那么$<u,v>$这条边通过的次数就是$1$次(画图就可以知道)。知道了每条边的通过次数,那么答案就是每条边通过次数的总和。
叶子节点总数为奇数:
这种情况下,与上面偶数的情况唯一不同的就是:有一个叶子节点无法配对。那么我们只需枚举哪一个叶子节点不配对即可。枚举从$root$开始,$dfs$一次就可以了。
这种题目虽然涉及到的知识量极少,但是思维量极高,对于这种题目弱渣表示暂时完全不能独立想出来。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} const int maxn=+;
int T,n,ans;
struct Edge{int u,v,nx;}e[*maxn];
int root,h[maxn],sz;
int f[maxn],r[maxn],d[maxn]; void add(int u,int v)
{
e[sz].u=u; e[sz].v=v; e[sz].nx=h[u]; h[u]=sz++;
} void dfs(int x,int fa)
{
int sum=; f[x]=d[x]=;
for(int i=h[x];i!=-;i=e[i].nx)
{
if(fa==e[i].v) continue;
sum++; dfs(e[i].v,x); f[x]=f[x]+f[e[i].v];
if(f[e[i].v]%==) d[x]=d[x]+; else d[x]=d[x]+;
}
if(sum==) f[x]=;
} void Find(int x,int fa,int Ans)
{
for(int i=h[x];i!=-;i=e[i].nx)
{
if(fa==e[i].v) continue;
if(f[e[i].v]==) { ans=min(ans,Ans); continue; }
else
{
if(f[e[i].v]%==) Find(e[i].v,x,Ans-);
else Find(e[i].v,x,Ans+);
}
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(h,-,sizeof h); memset(r,sz=,sizeof r); for(int i=;i<=n-;i++)
{
int u,v; scanf("%d%d",&u,&v);
r[u]++; r[v]++; add(u,v); add(v,u);
}
if(n==) { printf("1\n"); continue; }
if(n==) { printf("0\n"); continue; } for(int i=;i<=n;i++) if(r[i]!=) { root=i; break; } dfs(root,); ans=;
for(int i=;i<=n;i++)
{
if(i==root) continue;
if(f[i]%==) ans=ans+; else ans=ans+;
} if(f[root]%==) printf("%d\n",ans);
else { Find(root,,ans); printf("%d\n",ans); }
}
return ;
}
HDU 5758 Explorer Bo的更多相关文章
- HDU 5758 Explorer Bo(树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...
- HDU 5752 Sqrt Bo (数论)
Sqrt Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 Description Let's define the function f ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 5762 Teacher Bo (暴力)
Teacher Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...
- HDU 5752 Sqrt Bo【枚举,大水题】
Sqrt Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- hdu 5761 Rower Bo 物理题
Rower Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5761 Description There is a river on the Ca ...
- hdu 5762 Teacher Bo 暴力
Teacher Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...
- hdu 5753 Permutation Bo 水题
Permutation Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- hdu 5752 Sqrt Bo 水题
Sqrt Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 Description Let's define the function f ...
随机推荐
- 微信小程序开发系列(一)小程序开发初体验
开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领大家快速地学习和掌握小程序的开发. 关于还没有接触过小程序的开发者来说,最关心的问题无非就是,开发小 ...
- jmeter(八)-JDBC请求(sqlserver)
做JDBC请求,首先要了解这个JDBC对象是什么,然后寻找响应的数据库连接URL和数据库驱动. 数据库URL:jdbc:sqlserver://200.99.197.190:1433;database ...
- linux下正确安装jsoncpp
要安装jsoncpp,首先要下载好scons,再去安装jsoncpp scons下载地址:wget http://prdownloads.sourceforge.NET/scons/scons-2.2 ...
- 最强DE 战斗力 (nyoj 541)
题解链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=541 几天前百度题解后用数学知识AC的,后来大牛说这是一道动态规划题. 网上的数学解题链接 ...
- Linux下gcc,g++,gdb,scon部分用法笔记
1 Ubuntu下编译安装GCC-4.1.2 拷贝gcc-4.1.2.tar.bz2(我下载的压缩文件)到/usr/local/src 解压 新生成的gcc-4.1.2这个目录被称为源目录,用${sr ...
- iOS二维码生成与识别
在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件 ZBar 与 ZXing. 总结下各自的缺点: ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 & ...
- 安装oracle 10g时提示:操作系统版本: 必须是5.1或者5.2 怎么办?
1.在安装目录中搜索refhost.xml,然后在适当位置添加以下内容,注意括号配对 <!--Microsoft Windows 7--> <OPERATING_SYSTEM> ...
- Unity3D脚本使用:游戏对象访问
Unity3D中用到的组件 组件在js中对应的对象 使用如图: 注意:一个物体可以添加多个组件和多个js 同个物体上添加的js间引用
- lda 主题模型--TOPIC MODEL--Gibbslda++结果分析
在之前的博客中已经详细介绍了如何用Gibbs做LDA抽样.(http://www.cnblogs.com/nlp-yekai/p/3711384.html) 这里,我们讨论一下实验结果: 结果文件包括 ...
- 【bootstrap】时间选择器datetimepicker和daterangepicker
在bootstrap中的时间选择器有两种:dateTimePicker和dateRangePicker 1.dateTimePicker好像是官方嫡插件: 需要的文件: <link rel= ...