图中长度为k的路径的计数
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的路径的计数相关推荐
- 【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)
题干: 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: ...
- 输出图中两点间的全部路径
输出图中两点间的全部路径(可直接测试) 需要提前了解图以及图的存储和遍历的相关知识.回溯递归等要点,以下是具体代码实现 //输出图中一个点到另一个点的所有的路径 #include <iostre ...
- LeetCode 2099. 找到和最大的长度为 K 的子序列
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums 和一个整数 k . 你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一个长度为 ...
- LeetCode 1708. 长度为 K 的最大子数组
文章目录 1. 题目 2. 解题 1. 题目 在数组 A 和数组 B 中,对于第一个满足 A[i] != B[i] 的索引 i ,当 A[i] > B[i] 时,数组 A 大于数组 B. 例如, ...
- 2099 找到和最大的长度为 K 的子序列
题目描述: 给你一个整数数组 nums 和一个整数 k .你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一个长度为 k 的整数子序列. 子序列 定义为从 ...
- Leetcode-2099. 找到和最大的长度为 K 的子序列
链接 2099. 找到和最大的长度为 K 的子序列 题目 给你一个整数数组 nums 和一个整数 k .你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 . 请你返回 任意 一 ...
- 地铁线路图中任意两点间所有路径高效算法
在求图线任意两点间最短路径时,利用floyd.dijdstra等成熟的算法可以求得,效率还不错.但要求换乘最少.最舒适等路径时,需要求线网图中任意两个点的所有路径,然后根据条件筛选,以上算法无能为力. ...
- 【知识图谱论文】使用强化学习对时间知识图中的路径进行多跳推理
Article 文献题目:Multi-hop reasoning over paths in temporal knowledge graphs using reinforcement learnin ...
- 4014基于邻接表的长度为k的简单路径的求解
描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...
最新文章
- H.264 Video Codec速度和质量
- Tomcat内存溢出解决办法
- JQuery学习笔记 [Ajax] (6-2)
- 从程序员到CTO都应该了解的一些技术趋势
- transformer机制讲解_【核心代码解读】Transformer-XL
- 您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验
- gcc/g++ 使用 tricks
- 用Hello World校验Docker的安装
- 声音存储空间计算公式_音频中文件大小计算公式(转)
- 方钢管弹性模量计算方式_方管的强度计算公式
- 使用katana-parser解析css文件
- Love Letter
- 集线器,路由器,交换机的作用和区别是什么以及如何区分?
- 网络复现之基于TPS的STN网络
- Windows操作系统的日志分析
- postgresql计算两点距离
- Windows 清理磁盘
- 一个列子演示java中弱引用的回收时机
- 生存之道——提高认知度
- cruise软件模型,混动仿真模型,cruise与simulink联合仿真模型,Cruise混动仿真模型
热门文章
- Python+Selenium练习篇之11-浏览器上前进和后退操作
- spring第二冲刺阶段第十三天
- Leetcode 62. Unique Paths
- 第十六周 个人项目开发流程
- 九度oj 题目1354:和为S的连续正数序列
- C语言 小游戏之贪吃蛇
- 域名查询精灵V1.0 我写的软件,大家多多提建议
- ds90ub934 i2c 配置_DS90UB948-Q1:1080p 双路 FPD-Link III 解串器
- leetcode算法题--唯一元素的和
- python编程计算1!+2!+...+10!_如何用C语言编程计算 1!+2!+3!+…+10!?