列表

详情


NC18355. 路径数量

描述

给出一个 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 480K, 提交时间: 2018-09-07 19:51:00

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int a[40][40];
long long dp[40][40];
int main() {
	int n,k;
	cin >> n >> k;
	rep(i,1,n)
	rep(j,1,n)
	cin >>a[i][j];
	dp[0][1]=1;
	rep(i,1,k)
	rep(s,1,n)
	rep(e,1,n)
	if(a[s][e])
		dp[i][e] += dp[i-1][s];
	cout << dp[k][n];
}

Pascal(fpc 3.0.2) 解法, 执行用时: 1ms, 内存消耗: 256K, 提交时间: 2018-09-12 19:08:28

var f,map:array[0..100,0..100] of int64;
    n,k,i,j,h:longint;

begin
  readln(n,k);
  for i:=1 to n do
    for j:=1 to n do read(map[i,j]);
  f[0,1]:=1;
  for h:=1 to k do
    for i:=1 to n do
      for j:=1 to n do
        if map[i,j]=1 then
          f[h,j]:=f[h,j]+f[h-1,i];
  writeln(f[k,n]);
end.

上一题