首页 > 代码库 > noip 2003 传染病控制(历史遗留问题2333)
noip 2003 传染病控制(历史遗留问题2333)
/*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */#include<cstdio>#include<vector>#define maxn 310using 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;}
noip 2003 传染病控制(历史遗留问题2333)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。