洛谷 题解 P1041 【传染病控制】

您所在的位置:网站首页 p1041 洛谷 题解 P1041 【传染病控制】

洛谷 题解 P1041 【传染病控制】

2024-07-10 00:45| 来源: 网络整理| 查看: 265

【思路】

题目给出一棵树。第\(i\)步拆的一定是第\(i\)层与第\(i+1\)层之间的连边,否则不是最优(自行证明即可),所以可以暴力枚举每一次拆哪一个节点与上一个节点的连边。

把所有节点所在的层数存下来,一号点在第\(1\)层,枚举每一层的每个节点(由于\(1\)号节点已经被感染,从第二层开始搜索就可以了)

大概可分为以下几步:

存好一整棵树

把每一层的节点都存在一个数组里面

标记以ii号节点为根节点的子树的节点个数

标记与回溯

暴力搜索

【细节精讲】 1、树的存储

关于多叉树的存储,这里介绍一种简单有效的方法。考虑如下代码:

struct Node { int father; int child[MAXN]; }tree[MAXN];

\(tree[i]\)存\(i\)号节点的所有信息:

\(father\)存父亲(在这题没有用) ; \(child[]\)存它所有的孩子 ; \(child[0]\)是它孩子的个数。

由于数据范围很小,我们不用担心造成空间过多的浪费。

结构体构建完成之后,我们就可以在读入的同时把整棵树存好。

n=read();p=read(); for(int i=1;iy)swap(x,y); tree[y].father=x; tree[x].child[++tree[x].child[0]]=y; } 2 、标记深度

如果能够理解,标记深度是比较简单的。

404

如图:我们令\(1\)号节点的深度为\(1\) ; 则\(2,3\)节点深度为\(2\) ; \(4,5,6,7\)节点的深度为\(3\); \(8\)节点的深度为\(4\)。这棵树一共有\(4\)层。

代码用\(deep[i][j]\)存第\(i\)层第\(j\)个节点的编号。\(deep[i][0]\)是第\(i\)层一共的节点数。

inline void getdeep(int now,int Nowdeep)//当前的节点标号是now,层数是Nowdeep { maxdeep=max(maxdeep,Nowdeep);//标记一共有几层 for(int i=1;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3