noip 2003 传染病控制(历史遗留问题2333)

/*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */
#include<cstdio>
#include<vector>
#define maxn 310
using namespace std;
int n,m,num,head[maxn],fa[maxn],ans=0x7fffffff,f[maxn];
vector<int>G[maxn],Son[maxn];
struct node{
    int v,pre;
}e[maxn*2];
void Add(int from,int to){
    num++;e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
void Build(int now,int from,int dep){
    G[dep].push_back(now);fa[now]=from;
    for(int i=head[now];i;i=e[i].pre){
        int v=e[i].v;
        if(v!=from){
            Son[now].push_back(v);
            Build(v,now,dep+1);
        }
    }
}
void Dfs(int c,int sum){//当前深度 已经挂掉几个
    int num=0;
    if(sum>=ans)return;
    for(int i=0;i<G[c].size();i++){
        int x=G[c][i];
        if(f[x]==0)num++;//会挂掉的人数
    }
    if(num==0){//没有人会挂掉 停止搜索
        ans=min(ans,sum);return;
    }
    for(int i=0;i<G[c].size();i++){
        int x=G[c][i];
        if(f[x]){
            for(int k=0;k<Son[x].size();k++)
                f[Son[x][k]]=1;
        }
    }
    for(int i=0;i<G[c].size();i++){
        int x=G[c][i];if(f[x])continue;
        for(int k=0;k<Son[x].size();k++)
            f[Son[x][k]]=1;
        f[x]=1;Dfs(c+1,sum+num-1);f[x]=0;
        for(int k=0;k<Son[x].size();k++)
            f[Son[x][k]]=0;
    }
    for(int i=0;i<G[c].size();i++){//回溯 回溯 回溯 要 彻底
        int x=G[c][i];
        if(f[x]){
            for(int k=0;k<Son[x].size();k++)
                f[Son[x][k]]=0;
        }
    }

}
int main()
{
    freopen("epidemic.in","r",stdin);
    freopen("epidemic.out","w",stdout);
    scanf("%d%d",&n,&m);
    int u,v;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        Add(u,v);Add(v,u);
    }
    Build(1,0,0);Dfs(1,1);
    printf("%d\n",ans);
    return 0;
}
时间: 2024-08-09 06:23:10

noip 2003 传染病控制(历史遗留问题2333)的相关文章

NOIP 2003解题报告

第一题(神经网络): 题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w.入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][node]),k为与它相连(有向边指向node)的点.求所有出度为0且c>0的点. 解题过程: 此题的方法应该很多,比如拓扑排序,BFS等:我直接写了个递归,要求某个点的c,就先访问所有与它相连的点,递归下去直到 碰到入度为0的点.. 较麻烦的送分题,30分钟AC 第二题(侦探推理): 明明同学最近迷上

对历史遗留代码的维护和再开发

一.时间宽松时的代码维护 对于新人,一般都会留出一段时间进行代码的接手,那么对于如何处理接到手中的代码,是不是只是看看代码.写写心得,还是能够利用这段空闲时间,煅炼提升自己,我期望是后者,结合公司部门的情况,对这种情况进行个人阐释: 1.对现有代码的熟悉.若是对拿到手中的代码,都不知道是做什么的,有什么用,可能就什么意义也没有,后面的也不用看了. 2.加入或者补充测试用例,若是没有测试用例,后面的重构基本上是没办法进行判断是否正确的. 3.用测试用例对代码进行测试,以期达到相关效果和理解代码逻辑

java 泛型历史遗留问题

Map<String,Integer> hashMap = new HashMap<String,Integer>(); hashMap.put("123",123); // hashMap.put(123, ""); 编译出错 hashMap.get(new Date()); 不多说 直接上代码,泛型在编译期提供类型检查,如果不符合泛型的定义的类,那么在编译期会报错. 比如put()方法. 但是key 是String 类型,按理说参数传入D

Sass学习笔记 -- 变量及变量作用域历史遗留问题

sass有两种后缀名文件: 一种后缀名为sass,写选择器时不能使用大括号和分号 一种后缀名为scss,使用大括号和分号 //后缀名为sass的语法,不能出现大括号和分号 $highlight-color: #abcdef .selected   border: 1px $highlight-color solid    //后缀名为scss的语法,跟css一样,需要大括号和分号 $highlight-color: #abcdef; .selected{   border:1px solid $

Effective STL: 将vector和string的数据传给历史遗留的C风格API

如果有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了.对于string对象s,相应的咒语是简单的s.c_str(). void doSomething(const int* pInts, size_t numInts); if (!v.empty()) // 如果v为空,&v[0]试图产生一个指向根本就不存在的东西的指针 { doSomething(&v[0], v.size()); } // 以上从vector上

niop 2003 传染病控制 (哎呀我氧化钙 坑了好久的搜索题)

/* 我觉得挺对的啊 实在是考虑不到有什么情况会判不了 70分 就这样吧 - - */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #define maxn 310 using namespace std; int init() { int x=0;char s=getchar(); while(s<'0'|

VSTO 学习笔记(十三)谈谈VSTO项目的部署

原文:VSTO 学习笔记(十三)谈谈VSTO项目的部署 一般客户计算机专业水平不高,但是有一些Office水平相当了得,尤其对Excel的操作非常熟练.因此如果能将产品的一些功能集成在Office中,将会有很好的基础. 但是由于客户安装的Office版本不一,所以VSTO项目的部署问题显得尤为重要,需要考虑很多问题. 测试代码下载 本系列所有测试代码均在Visual Studio 2010 Ultimate SP1 + Office 2010 Professional Plus x64 SP1

在Swift中使用遗留的C API

Swift的类型系统的设计目的在于简化我们的生活,为此它强制用户遵守严格的代码规范来达到这一点.毫无疑问这是一件大好事,它鼓励程序员们编写 更好更正确的代码.然而,当Swift与历史遗留的代码库.特别是C语言库进行交互时,问题出现了.我们需要面对的现实是许多C语言库滥用类型,以至于它 们对Swift的编译器并不友好.苹果的Swift团队的确花了不少功夫来支持C的一些基础特性,比如C字符串.但当在Swift中使用历史遗留的C语言 库时,我们还是会面临一些问题.下面我们就来解决这些问题. 在开始之前

从ASCII到Unicode再到UTF-8的历史原由

编码 大小 支持语言 ASCII 1个字节 英文 Unicode 2个字节(生僻字4个) 所有语言 UTF-8 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 所有语言 具体解释: 最早只有127个字母被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122. 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去