• 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'||s>'9')s=getchar();
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x;
    }
    int n,m,c[maxn],son[maxn][maxn],sum[maxn],g[maxn][maxn],f[maxn];
    int size[maxn],fa[maxn],ans=0x3f3f3f3f;
    vector<int>so[maxn];
    void Build(int i)
    {
        f[i]=1;
        for(int j=0;j<so[i].size();j++)
          {
              int Son=so[i][j];
              if(f[Son]==0)
                {
                    fa[Son]=i;
                  son[i][++sum[i]]=Son;
                  Build(Son);
              }
          }
    }
    void Dfs(int i,int num)
    {
        int get=0;
        if(num>=ans)return;
        int Sum=0;
        for(int j=1;j<=size[i];j++)
          if(f[fa[g[i][j]]]==0)
            {
              Sum++;
              get=1;
            }
          else f[g[i][j]]=1;
        for(int j=1;j<=size[i];j++)
          {
              if(f[g[i][j]]==0)
                {
                    f[g[i][j]]=1;
                    Dfs(i+1,num+Sum-1);
                    f[g[i][j]]=0;
                    for(int k=1;k<=sum[g[i][j]];k++)
                      f[son[g[i][j]][k]]=0;
              }
          }
        if(get==0)
          {
              ans=min(ans,num);
            return;
          }
    }
    int main()
    {
        n=init();m=init();
        int x,y;
        c[1]=1;
        for(int i=1;i<=m;i++)
          {
              x=init();y=init();
            so[x].push_back(y);
            so[y].push_back(x);
          }
        Build(1);
        memset(f,0,sizeof(f));
        size[1]=1;g[1][1]=1;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=sum[i];j++)
            {
              int t=c[i]+1;
              c[son[i][j]]=t;
              g[t][++size[t]]=son[i][j];
            }
        Dfs(2,1);
        printf("%d
    ",ans);
        return 0;
    }
    /*
    看了题解之后的 感觉思路和自己的差不多 只不过这样清晰多了
    (好吧 不止清晰 .....100分 -) 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #define maxn 310
    using namespace std;
    int init()
    {
        int x=0;char s=getchar();
        while(s<'0'||s>'9')s=getchar();
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x;
    }
    int n,m,Max_c,son[maxn][maxn],sum[maxn],c[maxn];
    int ans=0x3f3f3f3f,num=1,f[maxn];
    vector<int>so[maxn];
    void Build(int i)
    {
        f[i]=1;
        for(int j=0;j<so[i].size();j++)
          {
              int Son=so[i][j];
              if(f[Son]==0)
                {
                  son[i][++sum[i]]=Son;
                  Build(Son);
              }
          }      
    }
    void Dfs(int p)
    {
        int get=0;
        if(num>=ans)return;
        int Sum=0;
        for(int i=1;i<=n;i++)
          if(c[i]==p)
            for(int j=1;j<=sum[i];j++)
              {
                  get=1;
                  c[son[i][j]]=p+1;
                  num++;
              }
        num--;
        for(int i=1;i<=n;i++)
          if(c[i]==p+1)
            {
              c[i]=0;
              Dfs(p+1);
              c[i]=p+1;
            }
        num++;
        for(int i=1;i<=n;i++)
          if(c[i]==p+1)
            {
              c[i]=0;num--;
            }
        if(get==0)
          {
              ans=min(ans,num);
            return;
          }
    }
    int main()
    {
        n=init();m=init();
        int x,y;
        c[1]=1;
        for(int i=1;i<=m;i++)
          {
              x=init();y=init();
            so[x].push_back(y);
            so[y].push_back(x);
          }
        Build(1);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=sum[i];j++)
            {
              int t=c[i]+1;
              Max_c=max(Max_c,t);
              c[son[i][j]]=t;
            }
        memset(c,0,sizeof(c));
        c[1]=1;
        Dfs(1);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    LOJ #6008. 「网络流 24 题」餐巾计划
    P2144 [FJOI2007]轮状病毒
    随记
    1010: [HNOI2008]玩具装箱toy(斜率优化)
    HDU 3507 Print Article(斜率优化)
    4819: [Sdoi2017]新生舞会(分数规划)
    POJ 2976 Dropping tests(01分数规划)
    spoj 104 Highways(Matrix-tree定理)
    dp专练
    4152: [AMPPZ2014]The Captain
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5536863.html
Copyright © 2020-2023  润新知