/*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */ #include<cstdio> #include<vector> #define maxn 310 using namespace std; int n,m,num,head[maxn],fa[maxn],ans=0x7fffffff,f[maxn]; vector<int>G[maxn],Son[maxn]; struct node{ int v,pre; }e[maxn*2]; void Add(int from,int to){ num++;e[num].v=to; e[num].pre=head[from]; head[from]=num; } void Build(int now,int from,int dep){ G[dep].push_back(now);fa[now]=from; for(int i=head[now];i;i=e[i].pre){ int v=e[i].v; if(v!=from){ Son[now].push_back(v); Build(v,now,dep+1); } } } void Dfs(int c,int sum){//当前深度 已经挂掉几个 int num=0; if(sum>=ans)return; for(int i=0;i<G[c].size();i++){ int x=G[c][i]; if(f[x]==0)num++;//会挂掉的人数 } if(num==0){//没有人会挂掉 停止搜索 ans=min(ans,sum);return; } for(int i=0;i<G[c].size();i++){ int x=G[c][i]; if(f[x]){ for(int k=0;k<Son[x].size();k++) f[Son[x][k]]=1; } } for(int i=0;i<G[c].size();i++){ int x=G[c][i];if(f[x])continue; for(int k=0;k<Son[x].size();k++) f[Son[x][k]]=1; f[x]=1;Dfs(c+1,sum+num-1);f[x]=0; for(int k=0;k<Son[x].size();k++) f[Son[x][k]]=0; } for(int i=0;i<G[c].size();i++){//回溯 回溯 回溯 要 彻底 int x=G[c][i]; if(f[x]){ for(int k=0;k<Son[x].size();k++) f[Son[x][k]]=0; } } } int main() { freopen("epidemic.in","r",stdin); freopen("epidemic.out","w",stdout); scanf("%d%d",&n,&m); int u,v; for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); Add(u,v);Add(v,u); } Build(1,0,0);Dfs(1,1); printf("%d\n",ans); return 0; }
时间: 2024-10-08 20:04:18