【题目链接】
【解题思路】
我们看见这道题很容易就会想到排列组合的乘法原理,但是我们每一位都有多少种可能呢,我们其实可以把这个问题转换成当前这位数字与多少个数字联通,我们这里处理是否联通用的是一种比较大众并且简单易懂的方法——Floyd变形
那么我们怎么变形呢我们看一下Floyd的模板
For (k = 1; k <= n; k++)
For (i = 1; i <= n; i++)
For (j = 1; j <= n; j++)
If (dis[i][j] >dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
我们用Floyd的板子求的是一个路径和的值,那么我们将联通视为1,不连通视为0,将Floyd简单地变一下就可以轻松实现了。
For (k = 1; k <= n; k++)
For (i = 1; i <= n; i++)
For (j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][k] && dis[k][j