原题链接:蓝桥杯历届试题-网络寻路
解题思路:
计数问题 这道题 使用动态规划最方便简洁高效,以下是动态规划的思路。
假设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截图
参考代码(只提供核心代码):
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复