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;
    }
  • 相关阅读:
    some things
    关于我的兼职创业历程
    慢牛APP相关截图
    慢牛系列五:用百度语音识别添加自选股
    慢牛系列四:好玩的React Native
    慢牛系列三:React Native实践
    慢牛系列二:前端技术选择
    慢牛系列一:如何抓取股票数据
    会写程序的屌丝是潜力股
    慢牛股票-基于Sencha+Cordova的股票类APP
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9842747.html
Copyright © 2011-2022 走看看