题目背景

近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。于是,蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播。经过 WHO(世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究清楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。

题目描述

研究表明,这种传染病的传播具有两种很特殊的性质;

第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不得病,或者是XY之间的传播途径被切断,则X就不会得病。

第二是,这种疾病的传播有周期性,在一个疾病传播周期之内,传染病将只会感染一代患者,而不会再传播给下一代。

这些性质大大减轻了蓬莱国疾病防控的压力,并且他们已经得到了国内部分易感人群的潜在传播途径图(一棵树)。但是,麻烦还没有结束。由于蓬莱国疾控中心人手不够,同时也缺乏强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有传播途径相连,且连接途径没有被切断的人群)。当不可能有健康人被感染时,疾病就中止传播。所以,蓬莱国疾控中心要制定出一个切断传播途径的顺序,以使尽量少的人被感染。

你的程序要针对给定的树,找出合适的切断顺序。

输入输出格式

输入格式:

输入格式的第一行是两个整数n(1≤n≤300)和p。接下来p行,每一行有两个整数i和j,表示节点i和j间有边相连(意即,第i人和第j人之间有传播途径相连)。其中节点1是已经被感染的患者。

输出格式:

只有一行,输出总共被感染的人数。

输入输出样例

输入样例#1:

  1. 7 6
  2. 1 2
  3. 1 3
  4. 2 4
  5. 2 5
  6. 3 6
  7. 3 7
输出样例#1:

 

如果按一棵树的形式搜索下去,状态太难记录了。改变思路,搜索当前层数。

先建好树,DFS当前深度,在同深度的可能被感染的人中选一个,阻断路径,然后感染其他可能被感染的人,进入下一层。到达最深层后记录答案,回溯……

先选人再感染其他人也麻烦,可以等价于先感染所有当前层可以感染的人,再选一个人治好(莫名喜感)

实际操作时,可以每次在当前层处理下一层的感染情况,会快一点。↑上面那样可能会T  (感谢RLT进行实验)

这种解法挺暴力的,好在数据不大。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<vector>
  7. using namespace std;
  8. const int mxn=;
  9. int read(){
  10. int x=,f=;char ch=getchar();
  11. while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
  12. while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
  13. return x*f;
  14. }
  15. int n,p;
  16. int ans=1e9;
  17. vector<int>e[mxn];
  18. int dep[mxn],num[mxn];
  19. bool ill[mxn];
  20. void Ncount(int u,int fa){
  21. num[u]++;
  22. for(int i=;i<e[u].size();i++){
  23. int v=e[u][i];if(v==fa)continue;
  24. dep[v]=dep[u]+;
  25. Ncount(v,u);
  26. num[u]+=num[v];
  27. }
  28. // printf("node:%d num:%d\n",u,num[u]);
  29. return;
  30. }
  31. void DFS(int d,int cnt){
  32. if(cnt>=ans)return;//最优性剪枝
  33. bool flag=;
  34. int i,j;
  35. for(i=;i<=n;i++)//向深层传染
  36. if(dep[i]==d && ill[i]){
  37. for(j=;j<e[i].size();j++){
  38. int v=e[i][j];
  39. if(dep[v]<dep[i])continue;
  40. flag=;
  41. ill[v]=;
  42. ++cnt;
  43. }
  44. }
  45.  
  46. --cnt;
  47. for(i=;i<=n;i++){
  48. if(dep[i]==d+ && ill[i]){//阻断传播
  49. ill[i]=;
  50. DFS(d+,cnt);
  51. ill[i]=;
  52. }
  53. }
  54. ++cnt;
  55. for(i=;i<=n;i++)//回溯
  56. if(dep[i]==d && ill[i]){
  57. for(j=;j<e[i].size();j++){
  58. int v=e[i][j];
  59. if(dep[v]<dep[i])continue;
  60. ill[e[i][j]]=;
  61. --cnt;
  62. }
  63. }
  64. if(flag){//传到了底层
  65. // printf("dep:%d\n",d);
  66. ans=min(ans,cnt);
  67. return;
  68. }
  69. }
  70. //
  71. int main(){
  72. int i,j;
  73. n=read();p=read();
  74. int u,v;
  75. for(i=;i<=p;i++){
  76. u=read();v=read();
  77. e[u].push_back(v);
  78. e[v].push_back(u);
  79. }
  80. dep[]=;
  81. Ncount(,);
  82. ill[]=;
  83. DFS(,);
  84. printf("%d\n",ans);
  85. return ;
  86. }

[NOIP2003] 提高组 洛谷P1041 传染病控制的更多相关文章

  1. [NOIP2003] 提高组 洛谷P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  2. [NOIP2003] 提高组 洛谷P1040 加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  3. [NOIP2003] 提高组 洛谷P1038 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  4. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

  6. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  7. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  8. [NOIP2012] 提高组 洛谷P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

  9. [NOIP2012] 提高组 洛谷P1083 借教室

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

随机推荐

  1. 小程序java解密

    <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16< ...

  2. enum,sizeof,typedef

    枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值可以根据需要自定义整形值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值得基础上加1 enum类型的变量只能去 ...

  3. CSS预处理less基本使用

    中文API http://lesscss.cn   变量 @变量名:变量值   @maincolor:#aeeeee; @acolor:#ffffff; @ht200:200px; @ht50:50p ...

  4. IntelliJ IDEA openfire 使用IntelliJ IDEA 部署OPENFIRE 服务端

    用MyEclipse部署OF的步骤,网上有很多,可以自行google,这里要记录的是用据说最好用的JAVA编辑器IntelliJ IDEA来部署OF服务端.试了好多下,终于成功了,记录下. 直接上图吧 ...

  5. 11gR2集群件任务角色分离(Job Role Separation)简介

       从11gR2版本开始,Oracle推荐使用不同的操作系统用户安装GI和数据库软件,例如:使用grid用户安装GI,使用Oracle用户安装数据库软件.当然,用户还是可以使用Oracle用户安装G ...

  6. node节点的部署

    master点赋予用户权限 [root@mast-1 k8s]# kubectl create clusterrolebinding kubelet-bootstrap \ > --cluste ...

  7. python数据类型常用内置函数之字符串

    1.strip, lstrip, rstrip x = ' jiahuifeng ' print(x.strip(' ')) print(x.lstrip(' ')) print(x.rstrip(' ...

  8. SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)

    有两种类型的空间数据.geometry 数据类型支持平面或欧几里得(平面球)数据.geometry 数据类型符合适用于 SQL 规范的开放地理空间联盟 (OGC) 简单特征 1.1.0 版. 另外,S ...

  9. 数据结构——RMQ

    RMQ 今天临放学前终于是学会了RMQ,特此写一篇题解来缅怀 RMQ是一种数据结构,用途是查询区间内最大值或最小值 或者你所要求的任意条件,主要思想是二进制的思想,其中还用到了dp的思想, 是一种非常 ...

  10. 深搜DFS

    POJ-1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...