Problem Description
题目给出一个有n个节点的有向图,求该有向图中长度为k的路径条数。方便起见,节点编号为1,2,…,n,用邻接矩阵表示该有向图。该有向图的节点数不少于2并且不超过500.
例如包含两个节点的有向图,图中有两条边1 → 2 ,2 → 1 。
长度为1的路径有两条:1 → 2 和 2 →1 ;
长度为2的路径有两条:1 → 2 → 1和2 → 1 → 2 ;
偷偷告诉你也无妨,其实这个图无论k取值多少 ( k > 0 ),长度为k的路径都是2条。
Input
多组输入,每组输入第一行是有向图中节点的数量即邻接矩阵的行列数n。接下来n行n列为该图的邻接矩阵。接下来一行是一个整数k.k小于30.
Output
输出一个整数,即为图中长度为k的路径的条数。
Sample Input
3 0 1 0 0 0 1 0 0 0 2
Sample Output
1
01 |
#include <stdio.h> |
02 |
#include <stdlib.h> |
03 |
#include <string.h> |
04 |
int a[501][501]; |
05 |
int b[501][501]; |
06 |
int c[501][501]; |
07 |
void f( int n) |
08 |
{ |
09 |
memset (c,0, sizeof (c)); |
10 |
int i,j,k; |
11 |
for (i=1;i<=n;i++) |
12 |
{ |
13 |
for (j=1;j<=n;j++) |
14 |
{ |
15 |
for (k=1;k<=n;k++) |
16 |
{ |
17 |
c[i][j]+=b[i][k]*a[k][j]; |
18 |
} |
19 |
} |
20 |
} |
21 |
} //求矩阵的乘法 |
22 |
int main() |
23 |
{ |
24 |
int i,j,k,m,n; |
25 |
while ( scanf ( "%d" ,&n)!=EOF) |
26 |
{ |
27 |
int s=0; |
28 |
for (i=1;i<=n;i++) |
29 |
{ |
30 |
for (j=1;j<=n;j++) |
31 |
{ |
32 |
scanf ( "%d" ,&a[i][j]); |
33 |
b[i][j]=a[i][j]; |
34 |
} |
35 |
} |
36 |
scanf ( "%d" ,&m); //输入路径数 |
37 |
for (i=1;i<=m-1;i++) //A的m-1次方 |
38 |
{ |
39 |
f(n); //求可达性矩阵 |
40 |
for (j=1;j<=n;j++) |
41 |
{ |
42 |
for (k=1;k<=n;k++) |
43 |
{ |
44 |
b[j][k]=c[j][k]; |
45 |
} |
46 |
} //把b[i][j]赋予新值,在进行矩阵的乘法 |
47 |
} |
48 |
for (i=1;i<=n;i++) |
49 |
{ |
50 |
for (j=1;j<=n;j++) |
51 |
{ |
52 |
s=s+b[i][j]; |
53 |
} |
54 |
} //求条数 |
55 |
printf ( "%d\n" ,s); |
56 |
} |
57 |
return 0; |
58 |
} |
59 |