题解有误
查看原帖
题解有误
508927
Fislett楼主2024/2/28 16:07
#include<iostream>
#include<cstdio>
#include<cstring>
  #include<queue>
   using namespace std;
   #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
   char buf[1<<21],*p1=buf,*p2=buf;
   inline int read(){
      #define num ch-'0'
      char ch;bool flag=0;int res;
      while(!isdigit(ch=getc()))
      (ch=='-')&&(flag=true);
     for(res=num;isdigit(ch=getc());res=res*10+num);
      (flag)&&(res=-res);
      #undef num
      return res;
  }
  #define Nosolution ((n==19)?20:30)
  const int N=1005;
  int w[N][N];
  inline void add(int u,int v){
      w[u][++w[u][0]]=v;
      w[v][++w[v][0]]=u;
  }
  int Brk[N],b[N],lca[N][N],d[N],vis[N],p[N],has[N];
  int s,t,n,dep,now;
  queue<int> q;
  void spfa(int s){
      memset(d,0x3f,sizeof(d));
      d[s]=0,q.push(s),vis[s]=1;
      while(!q.empty()){
          int u=q.front();q.pop();vis[u]=0;
          for(int i=1;i<=w[u][0];++i){
              int v=w[u][i];
              if(d[v]>d[u]+1){
                  d[v]=d[u]+1,p[v]=u;
                  if(!vis[v]) vis[v]=1,q.push(v);
              }
          }
      }
  }
  int cost=0;
  bool dfs(int deep){
      if(b[t]==2) return true;
      if(deep+lca[now][t]+cost>dep) return false;
      for(int i=1;i<=Brk[0];++i){
          int u=Brk[i];
          for(int j=1;j<=w[u][0];++j){
              int v=w[u][j];
              if(!b[v]){
                 Brk[i]=v;
                  if(u==now) now=v;
                  if(has[u]&&!has[v]&&b[u]!=2) --cost;
                 if(has[v]&&!has[u]&&b[u]!=2) ++cost;
                  swap(b[v],b[u]);
                  if(dfs(deep+1)) return true;
                  if(has[u]&&!has[v]&&b[v]!=2) ++cost;
                  if(has[v]&&!has[u]&&b[v]!=2) --cost;
                 if(now==v) now=u;
                  Brk[i]=u;
                 swap(b[v],b[u]);
              }
         }
      }
     return false;
 }
 int main(){
      n=read(),s=read(),t=read();
      now=s;
      Brk[++Brk[0]]=s;
     for(int i=0;i<n;++i){
         b[i]=read()^1;
        if(b[i]) Brk[++Brk[0]]=i;
         int s,v;
        s=read();
       for(int j=0;j<s;++j){
             v=read();
            if(!lca[i][v]&&lca[v][i]){
                add(i,v);
              }
              lca[i][v]=1;
        }
      }
      b[s]=2;
     for(int i=0;i<n;++i){
        spfa(i);
        for(int j=0;j<n;++j) lca[i][j]=d[j];
        if(i==s){
             int u=t;
            while(u!=s){
                has[u]=1;
                if(b[u]==1) ++cost;
                u=p[u];
            }
            has[s]=1;
          }
     }
     for(dep=1;dep<=6;++dep)
     if(dfs(0)) return printf("%d\n",dep),0;
     printf("%d\n",Nosolution);
     return 0;
 }

他的 Nosolution 是 ((n==19)?20:30)。

建议撤下题解。

2024/2/28 16:07
加载中...