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;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/5536863.html