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;
    }
  • 相关阅读:
    Java通过JNI调用C/C++
    Using HTML5 audio and video
    vmstat输出项解释
    uva 11237
    NN优化方法对照:梯度下降、随机梯度下降和批量梯度下降
    认识与学习bash
    系统崩溃,大圣归来
    连载《一个程序员的生命周期》-25.到工业现场学习业务知识引发的思考
    ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)
    UIView的几个枚举定义
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9842747.html
Copyright © 2011-2022 走看看