zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    转:五年java人的一点感悟
    6:ZigZag Conversion
    5:Longest Palindromic Substring
    4:Median of Two Sorted Arrays
    3:Longest Substring Without Repeating Characters
    读写分离
    docker swarm部署spring cloud服务
    kubeadm方式安装kubernetes
    《Spring Boot 实战》随记
    https部署
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5536863.html
Copyright © 2011-2022 走看看