zoukankan      html  css  js  c++  java
  • [NOIP2003]传染病控制题解

    题目链接:...

    思路:

    优化搜索顺序,用DFS按照bfs的思想,从每一层开始搜索,枚举删边。

    对于分层,dfs预处理一下就好了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define R register
    #define ll long long int
    using namespace std;
    const int N=1015;
    struct E{
        int nxt,to;
    }e[N];
    int n,p,num,ans=0x3f3f3f3f,shen,head[N],dep[N],ren[N][N],f[N],tim[N],flag[N];
    inline void add(R int u,R int v){
        e[++num].nxt=head[u];
        e[num].to=v;
        head[u]=num;
    }
    inline void dfs1(R int pos,R int fa){
        dep[pos]=dep[fa]+1;
        shen=max(shen,dep[pos]);
        f[pos]=fa;
        ren[dep[pos]][++tim[dep[pos]]]=pos;//当前深度  第几个  是什么
        for(R int i=head[pos];i;i=e[i].nxt){
            R int v=e[i].to;
            if(v!=fa)
            dfs1(v,pos);
        }
    }
    inline int check(R int depth){
        for(R int j=1;j<=tim[depth];++j)
        if(flag[f[ren[depth][j]]])return 0;
        return 1;
    }
    inline void dfs(R int depth,R int tot){//深度  第几个
        if(tot>=ans)return;
        if(check(depth)){
            ans=min(ans,tot);
            return;
        }
        for(R int j=1;j<=tim[depth];++j){
        if(flag[f[ren[depth][j]]]){
            flag[ren[depth][j]]=1;
            ++tot;
            }
        }
        for(R int i=1;i<=tim[depth];++i){//枚举删边
            if(flag[f[ren[depth][i]]]){
            flag[ren[depth][i]]=0;--tot;
            dfs(depth+1,tot);
            flag[ren[depth][i]]=1;++tot;
            }
        }
        for(R int j=1;j<=tim[depth];++j)
        if(flag[f[ren[depth][j]]])
        flag[ren[depth][j]]=0;
    }
    int main(){
        scanf("%d%d",&n,&p);
        for(R int i=1;i<=p;++i){
            R int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);add(v,u);
        }
        dfs1(1,0);
        flag[1]=1;
        dfs(2,1);
        if(ans==0x3f3f3f3f)
        printf("1");
        else
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    python文件操作,读取,修改,合并
    LWIP学习之流程架构
    嵌入式网络笔记
    AD17笔记
    STM32之VCP1/VCAP2引脚的处理
    AD中添加中文字符丝印的方法:
    磁珠与电感
    稳压二极管选型
    TVS选型
    光耦的使用
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9842747.html
Copyright © 2011-2022 走看看