【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)
生活随笔
收集整理的這篇文章主要介紹了
【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題干:
給出一個 n * n 的鄰接矩陣A.
A是一個01矩陣 .
A[i][j]=1表示i號點和j號點之間有長度為1的邊直接相連.
求出從 1 號點 到 n 號點長度為k的路徑的數(shù)目.
輸入描述:
第1行兩個數(shù)n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n+1行,為一個鄰接矩陣輸出描述:
題目中所求的數(shù)目示例1
輸入
復(fù)制
4 2 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0輸出
復(fù)制
2說明
?樣例如圖:
第一條路徑:1-2-4
第二條路徑:1-3-4
?
解題報告:
? ?這題用離散數(shù)學(xué)的那些關(guān)系矩陣的知識就可以求解了。直接求矩陣的k次方。
? ?其實這題數(shù)據(jù)還可以再加強,數(shù)據(jù)量大的話矩陣快速冪。
AC代碼:
#include<iostream> #include<cstdio> using namespace std; #define ll long long struct matrix {ll arr[35][35]; } ;//不要設(shè)置全局變量了 不好初始化 matrix unitMetrix; int n,k; matrix Mul(matrix a,matrix b) {matrix ans;for(int i = 1 ; i<=n; i++) {for(int j = 1 ; j<=n; j++) {ans.arr[i][j]=0;for(int k = 1 ; k<=n; k++) {ans.arr[i][j] += a.arr[i][k]*b.arr[k][j];}}}return ans; }int main() {matrix tmp,a;cin>>n>>k;for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {scanf("%lld",&a.arr[i][j]);}}tmp = a;for(int i = 1; i<=k-1; i++) {tmp = Mul(a,tmp);}printf("%lld\n",tmp.arr[1][n]);return 0 ; }?
總結(jié)
以上是生活随笔為你收集整理的【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CodeForces - 467C】G
- 下一篇: 【ZOJ - 3591】Nim(博弈问题