题目:B-路径数量_牛客OI赛制测试赛2 (nowcoder.com)
给出一个 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
说明
样例如图:
总结:
该题考察向量矩阵图论的含义
例:
设向量矩阵q
q 可表示从 1 号点 到 n 号点长度为1的路径的数目.
q*q 可表示从 1 号点 到 n 号点长度为2的路径的数目.
q*q*q 可表示从 1 号点 到 n 号点长度为3的路径的数目.
q*q*q*q 可表示从 1 号点 到 n 号点长度为4的路径的数目.
代码献上(向量乘积)
#include<iostream>
using namespace std;
long long dp[11][30];
int lin[30][30];
int main()
{
int N,K;
cin>>N>>K;
//输入
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
scanf("%d",lin[i]+j);
dp[0][0]=1;
//向量乘积
for(int i=1;i<=K;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
dp[i][j]+=lin[k][j]*dp[i-1][k];
cout<<dp[K][N-1]<<endl;
return 0;
}