链接:https://www.nowcoder.com/acm/contest/185/B
来源:牛客网
给出一个 n * n 的邻接矩阵A.
A是一个01矩阵 .
A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连.
求出从 1 号点 到 n 号点长度为k的路径的数目.
输入描述:
第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n+1行,为一个邻接矩阵
输出描述:
题目中所求的数目
示例1
输入
复制
4 2 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
输出
复制
2
说明
样例如图:
第一条路径:1-2-4
第二条路径:1-3-4
这道题我觉的用dp写更好理解一些,如果i和j之间有一条边,之间长度为k的路径,dp[i][k] += dp[j][k-1],dp数组表示从1号点到n号点长度为k的路径的数量。
#include <bits/stdc++.h>
using namespace std;
long long dp[55][55];
int a[55][55];
int n,k;
int main(){
while(~scanf("%d %d",&n,&k)){
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
scanf("%d",&a[i][j]);
}
}
dp[1][0] = 1;
for(int i = 1; i <= k; i++){
for(int j = 1; j <= n; j++){
for(int t = 1; t <= n; t++){
if(a[j][t]){ //jµãµ½tµãÖ®¼äÓÐÒ»Ìõ±ß
dp[t][i] += dp[j][i-1];
}
}
}
}
printf("%lld\n",dp[n][k]);
}
return 0;
}