1. 程式人生 > >[NOIP2003]傳染病控制題解

[NOIP2003]傳染病控制題解

代碼 枚舉 ref dfs col depth con head pac

題目鏈接:...

思路:

優化搜索順序,用DFS按照bfs的思想,從每一層開始搜索,枚舉刪邊。

對於分層,dfs預處理一下就好了。

代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define R register
#define ll long long int
using namespace std;
const int N=1015;
struct E{
    
int nxt,to; }e[N]; int n,p,num,ans=0x3f3f3f3f,shen,head[N],dep[N],ren[N][N],f[N],tim[N],flag[N]; inline void add(R int u,R int v){ e[++num].nxt=head[u]; e[num].to=v; head[u]=num; } inline void dfs1(R int pos,R int fa){ dep[pos]=dep[fa]+1; shen=max(shen,dep[pos]); f[pos]
=fa; ren[dep[pos]][++tim[dep[pos]]]=pos;//當前深度 第幾個 是什麽 for(R int i=head[pos];i;i=e[i].nxt){ R int v=e[i].to; if(v!=fa) dfs1(v,pos); } } inline int check(R int depth){ for(R int j=1;j<=tim[depth];++j) if(flag[f[ren[depth][j]]])return 0; return
1; } inline void dfs(R int depth,R int tot){//深度 第幾個 if(tot>=ans)return; if(check(depth)){ ans=min(ans,tot); return; } for(R int j=1;j<=tim[depth];++j){ if(flag[f[ren[depth][j]]]){ flag[ren[depth][j]]=1; ++tot; } } for(R int i=1;i<=tim[depth];++i){//枚舉刪邊 if(flag[f[ren[depth][i]]]){ flag[ren[depth][i]]=0;--tot; dfs(depth+1,tot); flag[ren[depth][i]]=1;++tot; } } for(R int j=1;j<=tim[depth];++j) if(flag[f[ren[depth][j]]]) flag[ren[depth][j]]=0; } int main(){ scanf("%d%d",&n,&p); for(R int i=1;i<=p;++i){ R int u,v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } dfs1(1,0); flag[1]=1; dfs(2,1); if(ans==0x3f3f3f3f) printf("1"); else printf("%d",ans); return 0; }

[NOIP2003]傳染病控制題解