解题思路:
        计数问题 这道题 使用动态规划最方便简洁高效,以下是动态规划的思路。

        假设d[k][i] 表示以i为起点,长度为k的路径(不经过自身)。

        此题K不大,只有3,所以 我们可以将k分类讨论(更易懂)

        则 d[0][i]=1

            d[1][i]=|G[i]|   //G[i]是i的邻接表

            d[2][i]+=d[1][j]-d[0][i] =d[1][j]-1 ; //j属于{G[i]}, 这里-d[0][i]就是去除1->2->1这种情况

            d[3][i]+=d[2][j]-d[1][i]+1 ; // 这里 -d[1][i] 去除 1->2->1->x 这种情况,但这样会多减一个1->2->1->2 这样的情况(k=2时,计算d[2][i]时保证了不会出现2->1->2),所以要+1;

注意事项:

    AC截图
    QQ截图20181220164742.png参考代码(只提供核心代码):

#define _for(i,a,b) for(int i=a;i<b;i++)

    _for(i,0,n)d[1][i]=G[i].size();//路径长度为1的时候
    _for(i,0,n){
        int len=G[i].size();
        _for(k,0,len){
            int j=G[i][k];
            d[2][i]+= d[1][j]-1; //路径长度为2的时候
        }
    }
    _for(i,0,n){
        int len=G[i].size();
        _for(k,0,len){
            int j=G[i][k];
            d[3][i]+= d[2][j]-d[1][i]+1; //路径长度为3的时候
        }
    }


 

0.0分

1 人评分

  评论区

  • «
  • »