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和K。接下来n行n列为该图的邻接矩阵。

Output

输出一个整数,即为图中长度为k的路径的条数。

样例输入

4 2

0 1 1 0

0 0 1 0

0 0 0 1

1 0 0 0

样例输出

6

解法:假设从U出发到V的长度为K的路径总数为Gk[U][V],那么k=1时和边值相同,因此G1就等于图的邻接矩阵.

假设已经得到Gk1和Gk2,那么G(k1+k2) = Gk1*Gk2.

Gk = (G1)^k.

所以此时候就可以用矩阵快速幂来进行求解.

 1 #include <iostream>
 2 #include <vector>
 3 #define ll long long int
 4 #define mod 10007
 5 using namespace std;
 6 typedef vector<ll> vec;
 7 typedef vector<vec> mat;
 8
 9 mat mul(mat &a,mat &b){
10     mat c(a.size(),vec(b[0].size()));
11     for(int i=0;i<a.size();i++){
12         for(int j=0;j<b[0].size();j++){
13             for(int k=0;k<b.size();k++){
14                 c[i][j] = (c[i][j]+a[i][k]*b[k][j]);
15             }
16         }
17     }
18     return c;
19 }
20
21 mat pow(mat a,int n){
22     mat c(a.size(),vec(a.size()));
23     for(int i=0;i<a.size();i++)
24         c[i][i] = 1;
25     while(n){
26         if(n&1)
27             c = mul(c,a);
28         a = mul(a,a);
29         n>>=1;
30     }
31     return c;
32 }
33
34 int main(){
35     int n,k;
36     cin>>n>>k;
37     mat a(n,vec(n));
38     for(int i=0;i<n;i++){
39         for(int j=0;j<n;j++){
40             cin>>a[i][j];
41         }
42     }
43     a = pow(a,k);
44     int ans = 0;
45     for(int i=0;i<n;i++){
46         for(int j=0;j<n;j++){
47             ans+=a[i][j];
48         }
49     }
50     cout<<ans<<endl;
51     return 0;
52 }

转载于:https://www.cnblogs.com/zllwxm123/p/9540391.html

图中长度为k的路径的计数相关推荐

  1. 【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)

    题干: 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: ...

  2. 输出图中两点间的全部路径

    输出图中两点间的全部路径(可直接测试) 需要提前了解图以及图的存储和遍历的相关知识.回溯递归等要点,以下是具体代码实现 //输出图中一个点到另一个点的所有的路径 #include <iostre ...

  3. LeetCode 2099. 找到和最大的长度为 K 的子序列

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个整数 k . 你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一个长度为 ...

  4. LeetCode 1708. 长度为 K 的最大子数组

    文章目录 1. 题目 2. 解题 1. 题目 在数组 A 和数组 B 中,对于第一个满足 A[i] != B[i] 的索引 i ,当 A[i] > B[i] 时,数组 A 大于数组 B. 例如, ...

  5. 2099 找到和最大的长度为 K 的子序列

    题目描述: 给你一个整数数组 nums 和一个整数 k .你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一个长度为 k 的整数子序列. 子序列 定义为从 ...

  6. Leetcode-2099. 找到和最大的长度为 K 的子序列

    链接 2099. 找到和最大的长度为 K 的子序列 题目 给你一个整数数组 nums 和一个整数 k .你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一 ...

  7. 地铁线路图中任意两点间所有路径高效算法

    在求图线任意两点间最短路径时,利用floyd.dijdstra等成熟的算法可以求得,效率还不错.但要求换乘最少.最舒适等路径时,需要求线网图中任意两个点的所有路径,然后根据条件筛选,以上算法无能为力. ...

  8. 【知识图谱论文】使用强化学习对时间知识图中的路径进行多跳推理

    Article 文献题目:Multi-hop reasoning over paths in temporal knowledge graphs using reinforcement learnin ...

  9. 4014基于邻接表的长度为k的简单路径的求解

    描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...

最新文章

  1. H.264 Video Codec速度和质量
  2. Tomcat内存溢出解决办法
  3. JQuery学习笔记 [Ajax] (6-2)
  4. 从程序员到CTO都应该了解的一些技术趋势
  5. transformer机制讲解_【核心代码解读】Transformer-XL
  6. 您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验
  7. gcc/g++ 使用 tricks
  8. 用Hello World校验Docker的安装
  9. 声音存储空间计算公式_音频中文件大小计算公式(转)
  10. 方钢管弹性模量计算方式_方管的强度计算公式
  11. 使用katana-parser解析css文件
  12. Love Letter
  13. 集线器,路由器,交换机的作用和区别是什么以及如何区分?
  14. 网络复现之基于TPS的STN网络
  15. Windows操作系统的日志分析
  16. postgresql计算两点距离
  17. Windows 清理磁盘
  18. 一个列子演示java中弱引用的回收时机
  19. 生存之道——提高认知度
  20. cruise软件模型,混动仿真模型,cruise与simulink联合仿真模型,Cruise混动仿真模型

热门文章

  1. Python+Selenium练习篇之11-浏览器上前进和后退操作
  2. spring第二冲刺阶段第十三天
  3. Leetcode 62. Unique Paths
  4. 第十六周 个人项目开发流程
  5. 九度oj 题目1354:和为S的连续正数序列
  6. C语言 小游戏之贪吃蛇
  7. 域名查询精灵V1.0 我写的软件,大家多多提建议
  8. ds90ub934 i2c 配置_DS90UB948-Q1:1080p 双路 FPD-Link III 解串器
  9. leetcode算法题--唯一元素的和
  10. python编程计算1!+2!+...+10!_如何用C语言编程计算 1!+2!+3!+…+10!?