题解

3 条题解

  • 1
    @ 2025-06-14 16:01:31
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define next nxt
    int point[100003],next[200003],v[200003],cnt=0,N,l[100003],r[100003],pre[100003],con[100003];
    const long long mo=1000000007;
    long long f[100003][2][2];
    int dp[100003][2][2];
    bool p[100003];
    void memsetf(){for(int i=0;i<=N;++i)for(int j=0;j<2;++j)for (int k=0;k<2;++k)f[i][j][k]=1;}
    void insect(int x,int y){next[cnt]=point[x];point[x]=cnt;v[cnt]=y;cnt++;}
    void dfs(int x)
    {
        if (x==0) return;
        int i,j=0;
        for (i=point[x];i!=-1;i=next[i])
         if (p[v[i]]==0)
         {
             p[v[i]]=1;
             if (l[x]==0) {l[x]=v[i];j=v[i];}
             else {r[j]=v[i];pre[v[i]]=j;j=v[i];}
         }
        dfs(j); con[j]=con[l[j]]+1;
        while (pre[j]!=-1){j=pre[j]; dfs(j); con[j]=con[l[j]]+con[r[j]]+1;}
    }
    void work(int x)
    {
        if (r[x]!=0) work(r[x]);
        if (l[x]!=0) work(l[x]);
        long long s=0; int num=1000000008;
        if ((l[x]==0)&&(r[x]==0))
        {
            dp[x][0][1]=1; dp[x][0][0]=1; dp[x][1][0]=0; return;
        }
        else
        if (l[x]==0)
        {
            dp[x][0][1]=1+dp[r[x]][0][0]; f[x][0][1]=f[r[x]][0][0];
            dp[x][0][0]=1+dp[r[x]][0][0]; f[x][0][0]=f[r[x]][0][0];
            dp[x][1][0]=dp[r[x]][1][0]; f[x][1][0]=f[r[x]][1][0];
            return;
        }
        else
        if (r[x]==0)
        {
            dp[x][0][1]=1+dp[l[x]][1][0]; f[x][0][1]=f[l[x]][1][0];
            //dp[x][0][0]=min(1+dp[l[x]][1][0],dp[l[x]][0][1]);
            if (1+dp[l[x]][1][0]<dp[l[x]][0][1])
             dp[x][0][0]=1+dp[l[x]][1][0],f[x][0][0]=f[l[x]][1][0];
            else
             if (1+dp[l[x]][1][0]>dp[l[x]][0][1])
              dp[x][0][0]=dp[l[x]][0][1],f[x][0][0]=f[l[x]][0][1];
             else
              dp[x][0][0]=dp[l[x]][0][1],f[x][0][0]=(f[l[x]][1][0]+f[l[x]][0][1])%mo;
            //dp[x][1][0]=min(1+dp[l[x]][1][0],dp[l[x]][0][0]);
            if (1+dp[l[x]][1][0]<dp[l[x]][0][0])
             dp[x][1][0]=1+dp[l[x]][1][0],f[x][1][0]=f[l[x]][1][0];
            else
             if (1+dp[l[x]][1][0]>dp[l[x]][0][0])
              dp[x][1][0]=dp[l[x]][0][0],f[x][1][0]=f[l[x]][0][0];
             else
              dp[x][1][0]=dp[l[x]][0][0],f[x][1][0]=(f[l[x]][1][0]+f[l[x]][0][0])%mo;
            return;
        }
        //dp[x][0][1]=min(dp[x][0][1],dp[l[x]][0][1]+dp[r[x]][0][1]);
        //dp[x][0][1]=min(dp[x][0][1],1+dp[l[x]][1][0]+dp[r[x]][0][0]);
        if (dp[l[x]][0][1]+dp[r[x]][0][1]<1+dp[l[x]][1][0]+dp[r[x]][0][0])
         dp[x][0][1]=dp[l[x]][0][1]+dp[r[x]][0][1],f[x][0][1]=(f[l[x]][0][1]*f[r[x]][0][1])%mo;
        else
         if (dp[l[x]][0][1]+dp[r[x]][0][1]>1+dp[l[x]][1][0]+dp[r[x]][0][0])
          dp[x][0][1]=1+dp[l[x]][1][0]+dp[r[x]][0][0],f[x][0][1]=(f[l[x]][1][0]*f[r[x]][0][0])%mo;
         else
          {
              dp[x][0][1]=1+dp[l[x]][1][0]+dp[r[x]][0][0];
            f[x][0][1]=((f[l[x]][0][1]*f[r[x]][0][1])%mo+(f[l[x]][1][0]*f[r[x]][0][0])%mo)%mo;
          }
        //dp[x][0][0]=min(dp[x][0][0],dp[l[x]][0][1]+dp[r[x]][0][0]);
        //dp[x][0][0]=min(dp[x][0][0],1+dp[l[x]][1][0]+dp[r[x]][0][0]);
        if (dp[l[x]][0][1]+dp[r[x]][0][0]<1+dp[l[x]][1][0]+dp[r[x]][0][0])
         dp[x][0][0]=dp[l[x]][0][1]+dp[r[x]][0][0],f[x][0][0]=(f[l[x]][0][1]*f[r[x]][0][0])%mo;
        else
         if (dp[l[x]][0][1]+dp[r[x]][0][0]>1+dp[l[x]][1][0]+dp[r[x]][0][0])
          dp[x][0][0]=1+dp[l[x]][1][0]+dp[r[x]][0][0],f[x][0][0]=(f[l[x]][1][0]*f[r[x]][0][0])%mo;
         else
          {
              dp[x][0][0]=1+dp[l[x]][1][0]+dp[r[x]][0][0];
              f[x][0][0]=((f[l[x]][1][0]*f[r[x]][0][0])%mo+(f[l[x]][0][1]*f[r[x]][0][0])%mo)%mo;
          }
        //dp[x][1][0]=min(dp[x][1][0],dp[l[x]][0][0]+dp[r[x]][1][0]);
        //dp[x][1][0]=min(dp[x][1][0],1+dp[l[x]][1][0]+dp[r[x]][1][0]);
        if (dp[l[x]][0][0]+dp[r[x]][1][0]<1+dp[l[x]][1][0]+dp[r[x]][1][0])
         dp[x][1][0]=dp[l[x]][0][0]+dp[r[x]][1][0],f[x][1][0]=(f[l[x]][0][0]*(f[r[x]][1][0]))%mo;
        else
         if (dp[l[x]][0][0]+dp[r[x]][1][0]>1+dp[l[x]][1][0]+dp[r[x]][1][0])
          dp[x][1][0]=1+dp[l[x]][1][0]+dp[r[x]][1][0],f[x][1][0]=(f[l[x]][1][0]*f[r[x]][1][0])%mo;
         else
          {
              dp[x][1][0]=1+dp[l[x]][1][0]+dp[r[x]][1][0];
              f[x][1][0]=((f[l[x]][0][0]*(f[r[x]][1][0]))%mo+(f[l[x]][1][0]*f[r[x]][1][0])%mo)%mo;
          }
    }
    int main()
    {
        memset(point,-1,sizeof(point));
        memset(next,-1,sizeof(next));
        memset(pre,-1,sizeof(pre));
        memset(dp,50,sizeof(dp));
        memset(v,0,sizeof(v));
        memset(p,0,sizeof(p));
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        scanf("%d\n",&N);
        memsetf();
        int i,x,y;
        for (i=1;i<N;++i)
        {
            scanf("%d %d\n",&x,&y);
            insect(x,y);insect(y,x);
        }p[1]=1;dfs(1);
        work(l[1]);
        if (dp[l[1]][0][1]<(1+dp[l[1]][1][0]))
         printf("%d\n%lld\n",dp[l[1]][0][1],f[l[1]][0][1]);
        else
         if (dp[l[1]][0][1]>(1+dp[l[1]][1][0]))
          printf("%d\n%lld\n",1+dp[l[1]][1][0],f[l[1]][1][0]);
         else
          printf("%d\n%lld\n",1+dp[l[1]][1][0],(f[l[1]][0][1]+f[l[1]][1][0])%mo);
        return 0;
    }
    
  • 1
    @ 2016-01-09 14:02:14

    题解在这里

  • -2
    @ 2015-12-20 19:31:33

    虽然我没有AC但我来抢个沙发

  • 1

信息

ID
1770
难度
7
分类
动态规划 | 树形DP 点击显示
标签
(无)
递交数
147
已通过
26
通过率
18%
被复制
3
上传者