P1041 传染病控制

题目背景

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

题目描述

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

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

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

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

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

输入输出格式

输入格式:

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

输出格式:

11行,总共被感染的人数。

输入输出样例

输入样例#1: 复制

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

//https://blog.csdn.net/wyxeainn/article/details/57087108
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f using namespace std; vector<int> v[],t[];
int level[];
int vis[];
int m,n,total,ans;
void create_tree(int node) ///构建有向树
{
vis[node] = ; //将节点node标记
for(int i = ; i < v[node].size(); i++) //size函数求出node容器中的元素个数,即与node相邻的节点
{
if(vis[v[node][i]]==)
{
t[node].push_back(v[node][i]);
create_tree(v[node][i]);
}
}
}
void dfs(int le) //一层一层地向下递归,初始level为1
{
int child = ; //child变量用来标记level+1层有没有节点,如果有,child=1
if(ans <= total) return; //如果当前情况患病人数比最佳答案ans多或相等,则直接return
for(int i = ; i <= m; i++) //共有m个人即m个节点,找出在le层的节点
{
if(level[i]==le)
{ for(int j = ; j < t[i].size(); j++)
{
child = ; //代表第le+1层上有节点
total++; //将le+1层上的节点数加到total上
level[t[i][j]]=le+; //节点i的孩子的level值赋为le+1
}
}
}//到此位置total是没有断开情况下,所有的患病人数
if(child==) ///如果第le+1层没有节点,递归结束条件之1
{
ans = min(ans,total); //获取ans和total的最小值
return;
}
else
{
total--; //每一轮传播都可以选择一个节点与它的父节点断开,则患病人数少1,total减减
for(int i = ; i <= m; i++)
{
if(level[i]==le+) //如果节点i在le+1层上,假如切断的节点是i与它前驱间的那条路
{
level[i]=; ///则将level[i]赋为0,则下次深搜便不会再考虑这个节点以及该节点的子节点。因为level[i]=0!=le+1
dfs(le+); /// 搜索第le+1层
level[i]=le+; ///回溯恢复原值
}
}
total++; //回溯,恢复到没有切断路的状态,则被传染的人增加1
for(int i = ; i <= m; i++) //到此,第le+1层都已经递归求过了。
{
if(level[i]==le+)
{
level[i]=; //将节点i的层数赋为0
total--;
}
}
}
}
int main()
{
int i,a,b; ///m个人,n个关系
while(~scanf("%d%d",&m,&n))
{
memset(vis,,sizeof(vis));
for(i = ;i <= m; i++)
{
v[i].clear(); //清空容器
t[i].clear();
}
for(i = ; i <= n; i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
total = ;
ans = INF;
create_tree() ; //构建有向树
level[]=;
dfs();
printf("%d\n",ans);
}
return ;
}

P1041 传染病控制(dfs)的更多相关文章

  1. [luogu]P1041 传染病控制[dfs]

    [luogu]P1041 传染病控制 ——!x^n+y^n=z^n 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的 ...

  2. 【搜索】P1041 传染病控制

    题目链接:P1041 传染病控制 题解: 这个题目是看别人的博客做出来的,其实挺不错的一个题目,考察的东西挺多的, 一个dfs可以处理5个东西: 1.找出父亲 2.找出深度 3.每一层的节点,存进Ve ...

  3. 洛谷 P1041 传染病控制

    P1041 传染病控制 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染 ...

  4. P1041 传染病控制——暴力遍历所有相同深度的节点

    P1041 传染病控制 说实话这种暴力我还是头一次见,每次病毒都会往下传染一层: 数据范围小,我们可以直接枚举当前层保护谁就好了: 用vector 记录相同层数的节点:维护已经断了的点: 如果超出最底 ...

  5. P1041 传染病控制【暴搜】

    P1041 传染病控制 提交 10.78k 通过 3.74k 时间限制 1.00s 内存限制 125.00MB 题目提供者CCF_NOI 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 ...

  6. Luogu P1041 传染病控制(搜索)

    P1041 传染病控制 题意 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这 ...

  7. P1041 传染病控制

    #include <bits/stdc++.h> using namespace std; const int maxn = 301; std::vector<int> son ...

  8. 洛谷P1041 传染病控制

    解:搜索...... 我们可以每次选择分支少的搜索,或者说,贪心的搜索当前更优的决策. 每一层把能剪的点搞出来,按照度数/SIZ排序,然后依次搜索.加个最优化剪枝就完事了. #include < ...

  9. luogu P1041 传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

随机推荐

  1. page用法

    分页一般场景用于查询所有数据 包引用 import org.springframework.data.domain.Page;import org.springframework.data.domai ...

  2. GDB程序调试

    GDB使用流程 1.编译生成可执行文件: gcc -g tst.c -o tst2.启动GDB gdb tst3. 在main 函数处设置断点 break main4. 运行程序 run GDB 命令 ...

  3. USGS bulk批量下载工具

    最近美国EarthExplorer上批量下载遥感数据---官方给出了批量下载工具BULK 下载地址:https://earthexplorer.usgs.gov/bulk/ bulk 使用帮助文档 根 ...

  4. Excel 导入时如何下载模板信息(Java)

    大家知道,我们在实现 Excel 上传的时候,会让我们去下载个模板,然后实现导入功能.在此我在这里记录下来,以便后续的使用... 首先思考一个问题是 这个模板这么给前台,还有这个模板是这么来的,刚开始 ...

  5. MDK5报错missing closing quote

    用emwin做界面的时候遇到的错误,MDK5可能无法编译一些汉字编码,对应汉字在信息反馈中会显示为乱码,更会附带一些如“expected a "}"”这样的错误提示. 解决方法:O ...

  6. How to Animate UILabel textColor Properties

    How to Animate UILabel Properties UILabel properties cannot be easy animated due to some various rea ...

  7. 使用Python画一个带坐标轴的圆

    Download Microsoft Visual Studio Microsoft Visual Studio enables you develop your python Application ...

  8. 【EMV L2】CDA复合动态数据认证/应用密文生成

    复合动态数据认证/应用密文生成处理流程:对于复合动态数据认证/应用密文生成,终端执行标准动态数据认证的步骤1到3:1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标 ...

  9. web页面弹出窗口代码大全

    //-----------按钮提示框----------// <input type="button" name="btn2" id="btn2 ...

  10. 关于layui中tablle 渲染数据后 sort排序问题

    最近在使用easyweb框架做后台管理,案例可见https://gitee.com/whvse/EasyWeb. 其中遇到了 sort排序问题, html代码:<table class=&quo ...