code1091 传染病控制

1.读入图,边是双向的

2.递归建树,同时确定每一层的节点

3.dfs按层搜索,先把这一层所有被传染的(die[pa[k]]=true的)的die置为true

然后循环,每次把一个die为true的变为false,表示断开这条边,继续dfs

dfs的最后记得把这一层die的全部置为false(查了一下午...)

退出条件:now当前死的人>=ans, f当前层>layerNum,num这一层死的人==0

代码:

#include<iostream>
#define Size 305
#define INF 10000000
using namespace std;

int n;
int g[Size][Size];
int layer[Size][Size];
int pa[Size];
bool vis[Size];
bool die[Size];
int ans=INF;
int layerNum=0;
int way[Size];

void buildTree(int k,int f){
    vis[k]=true;
    layer[f][++layer[f][0]]=k;
    if(f>layerNum)layerNum=f;

    for(int i=1;i<=g[k][0];i++){
        int s=g[k][i];
        if(!vis[s]){
            pa[s]=k;
            buildTree(s,f+1);
        }
    }
}

void dfs(int f,int now){//f:layer
    if(now>=ans)return;
    if(f>layerNum){
        ans=min(now,ans);
        /*cout<<ans<<": ";
        for(int i=1;i<=layerNum;i++)cout<<way[i]<<‘ ‘;
        cout<<endl;*/
        return;
    }
    int num=0;
    for(int i=1;i<=layer[f][0];i++){
        int k=layer[f][i];
        if(die[pa[k]])die[k]=true,num++;
    }
    if(num==0){
        ans=min(now,ans);
        return;
    }
    for(int i=1;i<=layer[f][0];i++){
        int k=layer[f][i];
        if(die[k]){
            way[f]=k;
            die[k]=false;
            dfs(f+1,now+num-1);
            die[k]=true;
        }
    }
    for(int i=1;i<=layer[f][0];i++){//退出之前清零当前层的die
        die[layer[f][i]]=false;
    }
}

int main(){
    freopen("1091.in","r",stdin);

    int p,a,b;
    cin>>n>>p;
    for(int i=1;i<=p;i++){
        cin>>a>>b;
        g[a][++g[a][0]]=b;
        g[b][++g[b][0]]=a;
    }
    buildTree(1,1);
    /*for(int i=1;i<=layerNum;i++){
        for(int j=1;j<=layer[i][0];j++)
            cout<<layer[i][j]<<‘ ‘;
        cout<<endl;
    }*/
    die[1]=true;
    dfs(2,1);
    cout<<ans<<endl;

    fclose(stdin);
    return 0;
} 
时间: 2024-10-08 14:06:13

code1091 传染病控制的相关文章

P1041 传染病控制

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

NOIP2003 传染病控制

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

[NOIP2003] 传染病控制题解

问题 F: [NOIP2003] 传染病控制 时间限制: 1 Sec  内存限制: 128 MB 题目描述 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府 决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群.于是,蓬莱国 的疾病控制中心决定采取切断传播途径的方法控制疾病传播.经过 WHO (世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径

洛谷 P1041 传染病控制

P1041 传染病控制 dfs枚举去掉的子树,更新当前感染节点 emmmm 这个题,每次去掉最大的子树的做法是错误的 比如 hhh,按照那个贪心的思路肯定是先去掉左边的子树,这样答案会是4 但是先去掉右边的子树的话答案就是3 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000+15 4 int n,m,x,y,fa[maxn],mmp[10000],sum[maxn],ans=1; 5 vector&l

P1041 传染病控制(dfs)

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

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

P1041 传染病控制 说实话这种暴力我还是头一次见,每次病毒都会往下传染一层: 数据范围小,我们可以直接枚举当前层保护谁就好了: 用vector 记录相同层数的节点:维护已经断了的点: 如果超出最底层或者都已经被保护就更新答案: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn=1010; v

[NOIP2003] 提高组 洛谷P1041 传染病控制

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

传染病控制(洛谷 1041 WA 90)

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

luogu cogs . [NOIP2003] 传染病控制 WA(1/2)

★★★   输入文件:epidemic.in   输出文件:epidemic.out   简单对比 时间限制:1 s   内存限制:128 MB [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府 决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群.于是,蓬莱国 的疾病控制中心决定采取切断传播途径的方法控制疾病传播.经过 WHO (世界卫生组织)以及全球各国科