niop 2003 传染病控制 (哎呀我氧化钙 坑了好久的搜索题)

Posted 一入OI深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",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\n",ans);
    return 0;
}

 

以上是关于niop 2003 传染病控制 (哎呀我氧化钙 坑了好久的搜索题)的主要内容,如果未能解决你的问题,请参考以下文章

NOIP2003传染病控制

P1041 [2003NOIP提高组]传染病控制

[NOIP2003] 提高组 洛谷P1041 传染病控制

luogu cogs . [NOIP2003] 传染病控制 WA(1/2)

noip 2003 传染病控制(历史遗留问题2333)

[NOIP2003] 传染病控制 搜索+剪枝