3 条题解

  • 1
    @ 2023-6-5 22:33:31
    #include<bits/stdc++.h>
    #define rg register
    #define il inline
    #define Min(a,b) (a)<(b)?(a):(b)
    #define Max(a,b) (a)>(b)?(a):(b)
    using namespace std;
    
    const int N=1510;
    
    void in(int &ans) {
        ans=0; char i=getchar();
        while(i<'0' || i>'9') i=getchar();
        while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
    }
    
    int n,cur;
    
    int to[N<<1],nex[N<<1],head[N];
    int dp[N][2];
    
    il void add(int a,int b) {
        to[++cur]=b;
        nex[cur]=head[a];
        head[a]=cur;
    }
    
    il void read() {
        for(rg int i=1;i<=n;i++) {
            int x,k,y; in(x),in(k);
            for(rg int j=1;j<=k;j++) {
                in(y); add(x,y),add(y,x);
            }
        }
    }
    
    void dfs(int u,int fa) {
        dp[u][1]=1,dp[u][0]=0;
        for(rg int i=head[u];i;i=nex[i]) {
            if(to[i]==fa) continue;
            dfs(to[i],u);
            dp[u][0]+=dp[to[i]][1];
            dp[u][1]+=Min(dp[to[i]][1],dp[to[i]][0]);
        }
    }
    
    int main()
    {
        in(n); read(); dfs(0,-1);
        printf("%d\n",Min(dp[0][0],dp[0][1]));
        return 0;
    }
    
    • 0
      @ 2023-6-5 20:57:45

      核心代码

      typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
      const ll N=4000;
      const ll INF=1e9+9;
      const ll mod=2147483647;
      const double EPS=1e-10;//-10次方约等于趋近为0
      const double Pi=3.1415926535897;
      
      struct node
      {
          ll v,nex;
      }e[N];
      
      ll head[N],cnt,n,m,k,x;
      ll f[N][2];//二维的只需要0或1即可,开大了memset会超时
      ll t,arr[N],rt;
      
      inline void add(ll u,ll v)
      {
          e[++cnt].nex=head[u];
          e[cnt].v=v;
          head[u]=cnt;
      }
      
      inline void init()
      {
          memset(f,0,sizeof f);
          memset(head,0,sizeof head);
          memset(arr,0,sizeof arr);
          cnt=0;
      }
      void dfs(ll u)
      {
          f[u][0]=0,f[u][1]=1;//站或不站,站则至少需要1名士兵
          for(ll i=head[u];i;i=e[i].nex)
          {
              dfs(e[i].v);//往下遍历
              f[u][0]+=f[e[i].v][1];//若不站则相邻的必须站有士兵
              f[u][1]+=min(f[e[i].v][1],f[e[i].v][0]);
          }
      }
      
      int main()
      {
          while(scanf("%lld",&n)!=EOF)
          {
              init();
              over(j,1,n)
              {
                  ll a,b;
                  scanf("%lld%lld",&a,&b);
                  over(i,1,b)
                  {
                      ll c;
                      scanf("%lld",&c);
                      arr[c]++;
                      add(a,c);//树是有向图
                  }
              }
              over(i,0,n)
              {
                  if(!arr[i])//找根
                  {
                      rt=i;
                      break;
                  }
              }
              dfs(rt);
              printf("%lld\n",min(f[rt][1],f[rt][0]));
          }
      }
      
      • 0
        @ 2023-6-5 19:08:46

        image

        #include<bits/stdc++.h>
        using namespace std;
        const int N=1510;
        int n,m,k,s,t,x,y,f[N][2];
        vector<int> e[N];
        void dfs(int u,int fa) {
            f[u][1]=1,f[u][0]=0;
            for(int &v:e[u]) {
                if(v==fa) continue;
                dfs(v,u);
                f[u][0]+=f[v][1];
                f[u][1]+=min(f[v][1],f[v][0]);
            }
        }
        int main()
        {
        	cin>>n;
        	for (int i=1;i<=n;++i){
        		cin>>x>>k;
        		for (int j=1;j<=k;++j){
        			cin>>y;
        			e[x].push_back(y);
        			e[y].push_back(x);
        		}
        	} 
        	dfs(0,-1);
            cout<<min(f[0][0],f[0][1]);
        }
        
        • 1

        信息

        ID
        129
        时间
        1000ms
        内存
        128MiB
        难度
        3
        标签
        递交数
        97
        已通过
        51
        上传者