题目链接:...
思路:
优化搜索顺序,用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; }